From 726a3bc3f4e1b135af58ef348a8f969d9077d099 Mon Sep 17 00:00:00 2001 From: Oleksij Rempel Date: Wed, 26 Jul 2017 17:50:14 +0200 Subject: usb: gadget: autostart: properly release f_multi_opts the same as for usb gadget autostarter. |commit 2b9bcff79a02f770fa730e2689ba35cc03c0da7d |Author: Sascha Hauer |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 Signed-off-by: Oleksij Rempel Signed-off-by: Sascha Hauer --- drivers/usb/gadget/autostart.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'drivers') 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); -- cgit v1.2.3