fix client memory leak accepted/tizen/unified/20200706.064224 submit/tizen/20200706.012610
authorYoungjae Shin <yj99.shin@samsung.com>
Tue, 30 Jun 2020 04:53:09 +0000 (13:53 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Mon, 6 Jul 2020 01:25:01 +0000 (10:25 +0900)
Change-Id: Ie9eee6ac96e2028703cb10d93edd727ac57d3afb

client/mdsc_get_modes.c

index bf1fd158af758ffde8b4feeeb5d9e7251ebde4f7..34109fd1201a3a4b3fb0b109e7076a3705d7259a 100644 (file)
@@ -27,7 +27,15 @@ struct mds_list_data_handle {
        int state;
 };
 
-static GList* _get_mode_list(GVariant *in_data)
+static void _free_mode(gpointer data)
+{
+       mode_list_data_h mode = data;
+       free(mode->id);
+       free(mode->name);
+       free(mode);
+}
+
+static GList* _get_mode_list(GVariant *in_data, int *result)
 {
        gchar *mode_id;
        gchar *mode_name;
@@ -41,8 +49,13 @@ static GList* _get_mode_list(GVariant *in_data)
                DBG("mode(%s) : state(%d)", mode_id, state);
                mode_list_data_h mode = malloc(sizeof(struct mds_list_data_handle));
                if (NULL == mode) {
-                       ERR("malloc() Fail");
-                       return NULL;
+                       ERR("malloc() Fail(%d)", errno);
+                       free(mode_id);
+                       free(mode_name);
+                       g_list_free_full(mode_list, _free_mode);
+                       mode_list = NULL;
+                       *result = MODES_ERROR_OUT_OF_MEMORY;
+                       break;
                }
                mode->id = strdup(mode_id);
                mode->name = strdup(mode_name);
@@ -71,7 +84,7 @@ static int _mdsc_dbus_get_modes_sync(mdsDbus *mdsc_dbus, GList **list)
                return MODES_ERROR_SYSTEM;
        }
 
-       *list = _get_mode_list(mode_list);
+       *list = _get_mode_list(mode_list, &result);
 
        return result;
 }
@@ -92,18 +105,9 @@ API int modes_get_modes(modes_h handle, GList **list)
        return MODES_ERROR_NONE;
 }
 
-static void _free_mode(gpointer data, gpointer user_data)
-{
-       mode_list_data_h mode = data;
-       free(mode->id);
-       free(mode->name);
-       free(mode);
-}
-
 API void modes_free_modes(GList *list)
 {
-       g_list_foreach(list, _free_mode, NULL);
-       g_list_free(list);
+       g_list_free_full(list, _free_mode);
 }
 
 API const char* modes_get_mode_id(mode_list_data_h data)