Fix a bug regarding category data
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_private.c
index 5f99d1a..4fa7551 100644 (file)
@@ -238,8 +238,10 @@ 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;
 
        switch (node->prop) {
        case E_PMINFO_PKGINFO_PROP_PACKAGE_ID:
@@ -328,18 +330,29 @@ 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 - 2);
+               }
+               strncat(buf, "?", MAX_QUERY_LEN - len - 1);
+               len += strlen("?");
                *params = g_list_append(*params, strdup(ptr));
                while ((ptr = strtok_r(NULL, ",", &saveptr))) {
-                       strncat(buf, ", ?", MAX_QUERY_LEN - strlen(", ?") - 1);
+                       strncat(buf, ", ?", MAX_QUERY_LEN - len - 1);
+                       len += strlen(", ?");
                        *params = g_list_append(*params, strdup(ptr));
                }
-               strncat(buf, ")", MAX_QUERY_LEN - 2);
+               strncat(buf, ")", MAX_QUERY_LEN - len - 1);
+               len += strlen("?");
                *condition = strdup(buf);
                flag = E_PMINFO_APPINFO_JOIN_CATEGORY;
+               free(value);
 
                return flag;
        case E_PMINFO_APPINFO_PROP_APP_NODISPLAY:
@@ -413,15 +426,15 @@ int __get_metadata_filter_condition(gpointer data, char **condition,
        char buf[MAX_QUERY_LEN];
        size_t len = 0;
 
-       len += strlen("(package_app_app_metadata.md_key=?");
        snprintf(buf, sizeof(buf), "(package_app_app_metadata.md_key=?");
+       len += strlen("(package_app_app_metadata.md_key=?");
        if (node->value) {
-               len += strlen(" AND package_app_app_metadata.md_value=?");
                strncat(buf, " AND package_app_app_metadata.md_value=?",
                                sizeof(buf) - len - 1);
+               len += strlen(" AND package_app_app_metadata.md_value=?");
        }
-       len += strlen(")");
        strncat(buf, ")", sizeof(buf) - len - 1);
+       len += strlen(")");
 
        *condition = strdup(buf);
        *params = g_list_append(*params, strdup(node->key));