Fix memory leak in usb gadget 95/197795/4 accepted/tizen/unified/20190128.061155 accepted/tizen/unified/20190129.064334 submit/tizen/20190117.112303 submit/tizen/20190128.105151
authorlokilee73 <changjoo.lee@samsung.com>
Wed, 16 Jan 2019 11:33:15 +0000 (20:33 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Thu, 17 Jan 2019 11:08:07 +0000 (20:08 +0900)
Change-Id: I437409ae6c162ecd7dd4a7abf70a5290f12cda98
Signed-off-by: lokilee73 <changjoo.lee@samsung.com>
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
hw/usb_client_common.c

index 7a77dc4..50008ef 100644 (file)
@@ -66,6 +66,8 @@
 #define EXPORT __attribute__ ((visibility("default")))
 #endif
 
+static void legacy_free_gadget(struct usb_gadget *gadget);
+
 static int get_int_from_file(char *path, int *_val, int base)
 {
        char buf[INT_BUF_SIZE];
@@ -563,6 +565,7 @@ static int legacy_enable(struct usb_client *usb)
                        goto stop_services;
        }
 
+       legacy_free_gadget(gadget);
        return 0;
 stop_services:
        while (--i >= 0) {
@@ -574,6 +577,7 @@ stop_services:
                                   struct usb_function_with_service, func);
                systemd_stop_service(fws->service);
        }
+       legacy_free_gadget(gadget);
 
 disable_gadget:
        sys_set_str(LEGACY_ENABLE_PATH, LEGACY_DISABLE);
@@ -598,10 +602,14 @@ static int legacy_disable(struct usb_client *usb)
                fws = container_of(gadget->funcs[i], struct usb_function_with_service, func);
                ret = systemd_stop_service(fws->service);
                if (ret < 0)
-                       return ret;
+                       goto free_gadget;
        }
 
-       return sys_set_str(LEGACY_ENABLE_PATH, LEGACY_DISABLE);
+       ret = sys_set_str(LEGACY_ENABLE_PATH, LEGACY_DISABLE);
+
+free_gadget:
+       legacy_free_gadget(gadget);
+       return ret;
 }
 
 static void legacy_free_config(struct usb_configuration *config)
@@ -657,6 +665,8 @@ static void legacy_free_gadget(struct usb_gadget *gadget)
 
                free(gadget->funcs);
        }
+
+       free(gadget);
 }
 
 EXPORT