diff options
author | Oleksij Rempel <o.rempel@pengutronix.de> | 2017-07-26 17:50:14 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-09-06 15:42:56 +0200 |
commit | 726a3bc3f4e1b135af58ef348a8f969d9077d099 (patch) | |
tree | dc442a25bac1c047d68ac97dae19e39afc3a06e6 /drivers | |
parent | 3b65edf6d0661ce60e8776fc400be564540e48ae (diff) | |
download | barebox-726a3bc3f4e1b135af58ef348a8f969d9077d099.tar.gz barebox-726a3bc3f4e1b135af58ef348a8f969d9077d099.tar.xz |
usb: gadget: autostart: properly release f_multi_opts
the same as for usb gadget autostarter.
|commit 2b9bcff79a02f770fa730e2689ba35cc03c0da7d
|Author: Sascha Hauer <s.hauer@pengutronix.de>
|Date: Fri Jan 20 10:03:45 2017 +0100
|
| usb: gadget: properly release f_multi_opts
|
| The usbgadget commands uses statically allocated f_multi_opts and passes
| this to usb_multi_register(). These f_multi_opts are of course no
| longer valid when we leave the usbgadget command. Luckily we do not use
| the data after we left the usbgadget command, so this never has been a
| problem. However, f_multi_opts has some allocated members which we can
| not free anymore on gadget unregistration because we no longer have the
| pointer to them.
|
| Fix this by adding a release function to struct f_multi_opts. This way
| we can allocate all memory dynamically and properly free it when not
| used anymore.
|
| Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/autostart.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/usb/gadget/autostart.c b/drivers/usb/gadget/autostart.c index 4ad1dd6be1..465d8fd380 100644 --- a/drivers/usb/gadget/autostart.c +++ b/drivers/usb/gadget/autostart.c @@ -31,19 +31,28 @@ static char *fastboot_function; static int usbgadget_autostart(void) { - struct f_multi_opts opts = {}; + struct f_multi_opts *opts; + int ret; if (!autostart) return 0; setenv("otg.mode", "peripheral"); + opts = xzalloc(sizeof(*opts)); + opts->release = usb_multi_opts_release; + if (fastboot_function) - opts.fastboot_opts.files = file_list_parse(fastboot_function); + opts->fastboot_opts.files = file_list_parse(fastboot_function); + + opts->create_acm = acm; + - opts.create_acm = acm; + ret = usb_multi_register(opts); + if (ret) + usb_multi_opts_release(opts); - return usb_multi_register(&opts); + return ret; } postenvironment_initcall(usbgadget_autostart); |