Fix a bug regarding category data 06/125506/1
authorjongmyeongko <jongmyeong.ko@samsung.com>
Mon, 17 Apr 2017 11:13:59 +0000 (20:13 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Tue, 18 Apr 2017 01:29:28 +0000 (18:29 -0700)
Because strtok() modifies the original data,
the second query for global db is affected.
this causes unexpected result of multiple categroy filtering.

Change-Id: I72595fe9d254c36bbb433ff035aa07d10fd34177
Signed-off-by: jongmyeongko <jongmyeong.ko@samsung.com>
(cherry picked from commit 56992a61025d8c50ec59e57b550d6f3215857164)

src/pkgmgrinfo_private.c

index b415acb..4fa7551 100644 (file)
@@ -238,6 +238,7 @@ int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **p
        pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data;
        char buf[MAX_QUERY_LEN] = {'\0'};
        int flag = 0;
+       char *value;
        char *ptr = NULL;
        char *saveptr = NULL;
        size_t len = 0;
@@ -329,9 +330,16 @@ int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **p
                break;
        case E_PMINFO_APPINFO_PROP_APP_CATEGORY:
                snprintf(buf, sizeof(buf), "package_app_app_category.category IN (");
-               ptr = strtok_r(node->value, ",", &saveptr);
-               if (ptr == NULL)
+               value = strdup(node->value);
+               if (value == NULL) {
+                       _LOGE("out of memeory");
                        return 0;
+               }
+               ptr = strtok_r(value, ",", &saveptr);
+               if (ptr == NULL) {
+                       free(value);
+                       return 0;
+               }
                strncat(buf, "?", MAX_QUERY_LEN - len - 1);
                len += strlen("?");
                *params = g_list_append(*params, strdup(ptr));
@@ -344,6 +352,7 @@ int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **p
                len += strlen("?");
                *condition = strdup(buf);
                flag = E_PMINFO_APPINFO_JOIN_CATEGORY;
+               free(value);
 
                return flag;
        case E_PMINFO_APPINFO_PROP_APP_NODISPLAY: