Do not free where it should not be freed 54/176754/6
authorYunjin Lee <yunjin-.lee@samsung.com>
Mon, 23 Apr 2018 07:24:59 +0000 (16:24 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Wed, 2 May 2018 02:07:38 +0000 (11:07 +0900)
- Fix previous commit's wrong fix that freeing resource even it should
not.

Change-Id: I4c087a20fb5244f33fe1f901ee614c28b910608b
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
ui/src/privacy_package_list_view.c

index 950e38da64db32b902ea96f26d5e9ec66f6b0ae7..f754031493d88161de080b16d4b31a362c45d442 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2016-2018 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -43,17 +43,15 @@ static char* privacy_name = NULL;
 
 #define DEFAULT_ICON_PATH _TZ_SYS_RO_APP"/org.tizen.privacy-setting/res/icon/default.png"
 #define UIDMAXLEN 10
+#define SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
 
 static void privacy_package_check_changed_cb(void *data, Evas_Object *obj, void *event_info);
 
 static void free_pkg_data(pkg_data_s *pkg_data)
 {
-       if (pkg_data->pkgid)
-               free(pkg_data->pkgid);
-       if (pkg_data->label)
-               free(pkg_data->label);
-       if (pkg_data->icon)
-               free(pkg_data->icon);
+       SAFE_FREE(pkg_data->pkgid);
+       SAFE_FREE(pkg_data->label);
+       SAFE_FREE(pkg_data->icon);
        if (pkg_data->applist)
                g_list_free_full(pkg_data->applist, free);
        if (pkg_data->privlist)
@@ -78,7 +76,7 @@ static void gl_del_cb(void *data, Evas_Object *obj)
 static void gl_menu_desc_del_cb(void *data, Evas_Object *obj)
 {
        char *text = data;
-       free(text);
+       SAFE_FREE(text);
 }
 
 static char* gl_text_get_cb(void *data, Evas_Object *obj, const char *part)
@@ -350,11 +348,12 @@ static int pkg_app_list_cb(pkgmgrinfo_appinfo_h pkg_handle, void* user_data)
 
 static int pkg_list_cb(pkgmgrinfo_pkginfo_h filter_handle, void *user_data)
 {
-       char* privilege_name = strdup((char*)user_data);
        char *pkgid = NULL;
        int ret = pkgmgrinfo_pkginfo_get_pkgid(filter_handle, &pkgid);
        return_if(ret != PMINFO_R_OK, , -1, "pkgmgrinfo_pkginfo_get_pkgid failed");
-       char *pkgidd = strdup(pkgid);
+
+       char* privilege_name = strdup((char*)user_data);
+       return_if(privilege_name == NULL, , -1, "strdup failed");
        GList* find = g_list_find_custom(pkg_list, pkgid, (GCompareFunc)strcmp);
        if (find != NULL) {
                /* Add privilege info to package data list */
@@ -369,35 +368,30 @@ static int pkg_list_cb(pkgmgrinfo_pkginfo_h filter_handle, void *user_data)
                                break;
                        }
                }
-               free(privilege_name);
-               free(pkgidd);
                return ret;
        }
 
        /* Add app list to package data item */
        pkgmgrinfo_pkginfo_h pkg_handle;
        ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkg_handle);
-       return_if(ret != PMINFO_R_OK, free(privilege_name); free(pkgidd), -1, "pkgmgrinfo_pkginfo_get_pkginfo failed");
+       return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name), -1, "pkgmgrinfo_pkginfo_get_pkginfo failed");
 
        /* See if the package is user-settable */
        int is_settable = privilege_info_is_user_settable(pkgid, privacy_name);
 
        if (is_settable == 1) {
-
+               char *pkgidd = strdup(pkgid);
+               return_if(pkgidd == NULL, SAFE_FREE(privilege_name); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup failed");
                pkg_list = g_list_append(pkg_list, pkgidd);
 
                /* Make package data item */
                pkg_data_s *pkg_data = (pkg_data_s *)malloc(sizeof(pkg_data_s));
-               return_if(pkg_data == NULL, free(privilege_name); free(pkgidd); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "malloc of pkg_data failed.");
+               return_if(pkg_data == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "malloc of pkg_data failed.");
                pkg_data->label=NULL;
                pkg_data->icon=NULL;
                pkg_data->applist=NULL;
                pkg_data->privlist=NULL;
-               pkg_data->pkgid=NULL;
-
-               /* Add pkg id to package data item */
-               pkg_data->pkgid = strdup(pkgid);
-               return_if(pkg_data->pkgid == NULL, free(privilege_name); free(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->pkgid failed");
+               pkg_data->pkgid=pkgidd;
 
                /* Add privilege info to package data item */
                pkg_data->privlist = NULL;
@@ -406,27 +400,29 @@ static int pkg_list_cb(pkgmgrinfo_pkginfo_h filter_handle, void *user_data)
                /* Add app list to package data item */
                pkg_data->applist = NULL;
                ret = pkgmgrinfo_appinfo_get_list(pkg_handle, PMINFO_ALL_APP, pkg_app_list_cb, pkg_data);
-               return_if(ret != PMINFO_R_OK, free(privilege_name); free(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_appinfo_get_list failed");
+               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_appinfo_get_list failed");
 
                /* See if the package is global. TBD: If notion for handling of global app is required. */
                pkg_data->is_global = false;
                ret = pkgmgrinfo_pkginfo_is_global(pkg_handle, &pkg_data->is_global);
-               return_if(ret != PMINFO_R_OK, free(privilege_name); free(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_is_global failed");
+               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_is_global failed");
 
                /* Get package label */
                char* label = NULL;
                ret = pkgmgrinfo_pkginfo_get_label(pkg_handle, &label);
-               return_if(ret != PMINFO_R_OK, free(privilege_name); free(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_label failed");
+               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_label failed");
                pkg_data->label = strdup(label);
+               return_if(pkg_data->label == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->label failed");
 
                /* Get package icon path */
                char* icon = NULL;
                ret = pkgmgrinfo_pkginfo_get_icon(pkg_handle, &icon);
-               return_if(ret != PMINFO_R_OK, free(privilege_name); free(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_icon failed");
+               return_if(ret != PMINFO_R_OK, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "pkgmgrinfo_pkginfo_get_icon failed");
                if (EINA_TRUE == ecore_file_exists(icon))
                        pkg_data->icon = strdup(icon);
                else
                        pkg_data->icon = strdup(DEFAULT_ICON_PATH);
+               return_if(pkg_data->icon == NULL, SAFE_FREE(privilege_name); SAFE_FREE(pkgidd); free_pkg_data(pkg_data); pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle), -1, "strdup of pkg_data->icon failed");
 
                /* Get package privacy status */
                pkg_data->status = false;
@@ -435,22 +431,16 @@ static int pkg_list_cb(pkgmgrinfo_pkginfo_h filter_handle, void *user_data)
                /* Append package data item to package_data_list */
                pkg_data_list = g_list_append(pkg_data_list, pkg_data);
        }
-       free(privilege_name);
-       free(pkgidd);
        pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle);
        return ret;
 }
 static int get_uniq_pkg_list_by_privacy(const char* privacy)
 {
        int ret = 0;
-       /* For privilege list loop -> Get pkg_list by privilege */
-       if (pkg_list != NULL) {
-               g_list_free_full(pkg_list, free);
-               pkg_list = NULL;
-       }
        if (pkg_data_list != NULL) {
                g_list_free_full(pkg_data_list, free_extension_pkg_data);
                pkg_data_list = NULL;
+               pkg_list = NULL;
        }
        GList* l;
        int uid = getuid();