Fix wrong size calculation of using strncat 81/124281/1
authorSangyoon Jang <s89.jang@samsung.com>
Tue, 11 Apr 2017 05:08:09 +0000 (14:08 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Tue, 11 Apr 2017 05:08:09 +0000 (14:08 +0900)
Change-Id: I28edc4f1d1011d4ff89448998917a099b671deb6
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/pkgmgrinfo_appinfo.c
src/pkgmgrinfo_pkginfo.c
src/pkgmgrinfo_private.c

index 08db1f5..6211b79 100644 (file)
@@ -68,8 +68,8 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
                        "(SELECT package FROM package_info WHERE package_disable='false')";
        GSList *list;
 
-       len += strlen(" WHERE 1=1");
        strncat(buf, " WHERE 1=1", MAX_QUERY_LEN - len - 1);
+       len += strlen(" WHERE 1=1");
 
        if (filter == NULL) {
                strncat(buf, query_pkg_disable, MAX_QUERY_LEN - len - 1);
@@ -82,35 +82,35 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
                if (condition == NULL)
                        continue;
 
-               len += strlen(" AND ");
                strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
+               len += strlen(" AND ");
 
-               len += strlen(condition);
                strncat(buf, condition, sizeof(buf) - len - 1);
+               len += strlen(condition);
                free(condition);
                condition = NULL;
        }
 
        if (filter->list_metadata) {
-               len += strlen(" AND (");
                strncat(buf, " AND (", MAX_QUERY_LEN - len - 1);
+               len += strlen(" AND (");
        }
        for (list = filter->list_metadata; list; list = list->next) {
                joined |= __get_metadata_filter_condition(list->data,
                                &condition, bind_params);
                if (condition == NULL)
                        continue;
-               len += strlen(condition);
                strncat(buf, condition, sizeof(buf) - len - 1);
+               len += strlen(condition);
                free(condition);
                condition = NULL;
 
-               len += strlen(" OR ");
                strncat(buf, " OR ", MAX_QUERY_LEN - len - 1);
+               len += strlen(" OR ");
        }
        if (filter->list_metadata) {
-               len += strlen("1=0)");
                strncat(buf, "1=0)", MAX_QUERY_LEN - len - 1);
+               len += strlen("1=0)");
        }
 
        if (joined & E_PMINFO_APPINFO_JOIN_LOCALIZED_INFO) {
@@ -135,8 +135,8 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
                len += strlen(join_appinfo_for_uid);
        }
        strncat(tmp_query, buf, MAX_QUERY_LEN - len - 1);
-
        len += strlen(buf);
+
        strncat(tmp_query, query_pkg_disable, MAX_QUERY_LEN - len - 1);
 
        *query = strdup(tmp_query);
index 0272937..ae1073c 100644 (file)
@@ -242,19 +242,19 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
        if (filter == NULL)
                return PMINFO_R_OK;
 
-       len += strlen(" WHERE 1=1 ");
        strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
+       len += strlen(" WHERE 1=1 ");
        for (list = filter->list; list; list = list->next) {
                joined |= __get_filter_condition(list->data, uid, &condition,
                                bind_params);
                if (condition == NULL)
                        continue;
 
-               len += strlen(" AND ");
                strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
+               len += strlen(" AND ");
 
-               len += strlen(condition);
                strncat(buf, condition, sizeof(buf) - len - 1);
+               len += strlen(condition);
                free(condition);
                condition = NULL;
        }
index 5f99d1a..b415acb 100644 (file)
@@ -240,6 +240,7 @@ int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **p
        int flag = 0;
        char *ptr = NULL;
        char *saveptr = NULL;
+       size_t len = 0;
 
        switch (node->prop) {
        case E_PMINFO_PKGINFO_PROP_PACKAGE_ID:
@@ -331,13 +332,16 @@ int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **p
                ptr = strtok_r(node->value, ",", &saveptr);
                if (ptr == NULL)
                        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;
 
@@ -413,15 +417,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));