Fix misusing of strncat
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_pkginfo.c
index 0531930..a5b47d6 100644 (file)
@@ -234,39 +234,32 @@ static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
        char buf[MAX_QUERY_LEN] = { '\0' };
        char buf2[MAX_QUERY_LEN] = { '\0' };
        char *condition = NULL;
-       size_t len = 0;
        GSList *list = NULL;
 
        if (filter == NULL)
                return PMINFO_R_OK;
 
-       strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
-       len += strlen(" WHERE 1=1 ");
+       snprintf(buf, sizeof(buf), "%s", " 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;
 
-               strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
-               len += strlen(" AND ");
+               strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1);
 
-               strncat(buf, condition, sizeof(buf) - len - 1);
-               len += strlen(condition);
+               strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
                free(condition);
                condition = NULL;
        }
 
        if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
-               strncat(buf2, join_localized_info, MAX_QUERY_LEN - len - 1);
-               len += strlen(join_localized_info);
+               strncat(buf2, join_localized_info, sizeof(buf2) - strlen(buf2) - 1);
                *bind_params = g_list_append(*bind_params, strdup(locale));
        }
-       if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO) {
-               strncat(buf2, join_privilege_info, MAX_QUERY_LEN - len - 1);
-               len += strlen(join_privilege_info);
-       }
-       strncat(buf2, buf, MAX_QUERY_LEN - len - 1);
+       if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO)
+               strncat(buf2, join_privilege_info, sizeof(buf2) - strlen(buf2) - 1);
+       strncat(buf2, buf, sizeof(buf2) - strlen(buf2) - 1);
 
        *query = strdup(buf2);
        if (*query == NULL)
@@ -338,16 +331,16 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
                pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
 {
        static const char query_raw[] =
-               "SELECT DISTINCT pi.package, pi.package_version, "
-               "pi.install_location, pi.package_removable, "
-               "pi.package_preload, pi.package_readonly, pi.package_update, "
-               "pi.package_appsetting, pi.package_system, pi.package_type, "
-               "pi.package_size, pi.installed_time, pi.installed_storage, "
-               "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
-               "pi.root_path, pi.csc_path, pi.package_nodisplay, "
-               "pi.package_api_version, pi.package_support_disable, "
-               "pi.package_tep_name, pi.package_zip_mount_file, pi.external_path, "
-               "pi.package_support_mode";
+               "SELECT DISTINCT pi.package, pi.installed_storage, pi.external_path";
+       static const char query_basic[] =
+               ", pi.package_version, pi.install_location, "
+               "pi.package_removable, pi.package_preload, pi.package_readonly, "
+               "pi.package_update, pi.package_appsetting, pi.package_system, "
+               "pi.package_type, pi.package_size, pi.installed_time, "
+               "pi.storeclient_id, pi.mainapp_id, pi.package_url, pi.root_path, "
+               "pi.csc_path, pi.package_nodisplay, pi.package_api_version, "
+               "pi.package_support_disable, pi.package_tep_name, "
+               "pi.package_zip_mount_file, pi.package_support_mode";
        static const char query_author[] =
                ", pi.author_name, pi.author_email, pi.author_href";
        static const char query_label[] =
@@ -365,7 +358,6 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
        static const char query_from_clause[] = " FROM package_info as pi";
        int ret = PMINFO_R_ERROR;
        int idx = 0;
-       int query_len = 0;
        char *dbpath;
        char *tmp_record = NULL;
        char *constraints = NULL;
@@ -377,6 +369,7 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
        sqlite3_stmt *stmt = NULL;
        pkgmgrinfo_filter_x *tmp_filter = NULL;
        bool is_check_storage = true;
+       const uid_t global_user_uid = GLOBAL_USER;
 
        dbpath = getUserPkgParserDBPathUID(uid);
        if (dbpath == NULL)
@@ -384,7 +377,7 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
 
        ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
        if (ret != SQLITE_OK) {
-               _LOGD("failed to open db: %d", ret);
+               _LOGD("failed to open db(%s): %d", dbpath, ret);
                free(dbpath);
                return PMINFO_R_ERROR;
        }
@@ -402,30 +395,25 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
 
        is_check_storage = __check_package_storage_status(tmp_filter);
 
-       query_len = strlen(query_raw);
        snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
-       if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
-               strncat(query, query_author, MAX_QUERY_LEN - query_len - 1);
-               query_len += strlen(query_author);
-       }
+       if (flag & PMINFO_APPINFO_GET_BASICINFO)
+               strncat(query, query_basic, sizeof(query) - strlen(query) - 1);
+       if (flag & PMINFO_PKGINFO_GET_AUTHOR)
+               strncat(query, query_author, sizeof(query) - strlen(query) - 1);
        if (flag & PMINFO_PKGINFO_GET_LABEL) {
-               strncat(query, query_label, MAX_QUERY_LEN - query_len - 1);
-               query_len += strlen(query_label);
+               strncat(query, query_label, sizeof(query) - strlen(query) - 1);
                bind_params = g_list_append(bind_params, strdup(locale));
        }
        if (flag & PMINFO_PKGINFO_GET_ICON) {
-               strncat(query, query_icon, MAX_QUERY_LEN - query_len - 1);
-               query_len += strlen(query_icon);
+               strncat(query, query_icon, sizeof(query) - strlen(query) - 1);
                bind_params = g_list_append(bind_params, strdup(locale));
        }
        if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
-               strncat(query, query_description, MAX_QUERY_LEN - query_len - 1);
-               query_len += strlen(query_description);
+               strncat(query, query_description, sizeof(query) - strlen(query) - 1);
                bind_params = g_list_append(bind_params, strdup(locale));
        }
 
-       strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1);
-       query_len += strlen(query_from_clause);
+       strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1);
 
        ret = _get_filtered_query(tmp_filter, locale, uid, &constraints, &bind_params);
        if (ret != PMINFO_R_OK) {
@@ -434,7 +422,7 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
        }
 
        if (constraints)
-               strncat(query, constraints, MAX_QUERY_LEN - query_len - 1);
+               strncat(query, constraints, sizeof(query) - strlen(query) - 1);
 
        ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
        if (ret != SQLITE_OK) {
@@ -458,39 +446,36 @@ static int _pkginfo_get_packages(uid_t uid, const char *locale,
                }
                idx = 0;
                _save_column_str(stmt, idx++, &info->package);
-               if (g_hash_table_contains(packages,
-                                       (gconstpointer)info->package)) {
-                       free(info->package);
-                       free(info);
-                       info = NULL;
-                       continue;
-               }
-               _save_column_str(stmt, idx++, &info->version);
-               _save_column_str(stmt, idx++, &info->installlocation);
-               _save_column_str(stmt, idx++, &info->removable);
-               _save_column_str(stmt, idx++, &info->preload);
-               _save_column_str(stmt, idx++, &info->readonly);
-               _save_column_str(stmt, idx++, &info->update);
-               _save_column_str(stmt, idx++, &info->appsetting);
-               _save_column_str(stmt, idx++, &info->system);
-               _save_column_str(stmt, idx++, &info->type);
-               _save_column_str(stmt, idx++, &info->package_size);
-               _save_column_str(stmt, idx++, &info->installed_time);
                _save_column_str(stmt, idx++, &info->installed_storage);
-               _save_column_str(stmt, idx++, &info->storeclient_id);
-               _save_column_str(stmt, idx++, &info->mainapp_id);
-               _save_column_str(stmt, idx++, &info->package_url);
-               _save_column_str(stmt, idx++, &info->root_path);
-               _save_column_str(stmt, idx++, &info->csc_path);
-               _save_column_str(stmt, idx++, &info->nodisplay_setting);
-               _save_column_str(stmt, idx++, &info->api_version);
-               _save_column_str(stmt, idx++, &info->support_disable);
-               _save_column_str(stmt, idx++, &info->tep_name);
-               _save_column_str(stmt, idx++, &info->zip_mount_file);
                _save_column_str(stmt, idx++, &info->external_path);
-               _save_column_str(stmt, idx++, &info->support_mode);
+
+               if (flag & PMINFO_APPINFO_GET_BASICINFO) {
+                       _save_column_str(stmt, idx++, &info->version);
+                       _save_column_str(stmt, idx++, &info->installlocation);
+                       _save_column_str(stmt, idx++, &info->removable);
+                       _save_column_str(stmt, idx++, &info->preload);
+                       _save_column_str(stmt, idx++, &info->readonly);
+                       _save_column_str(stmt, idx++, &info->update);
+                       _save_column_str(stmt, idx++, &info->appsetting);
+                       _save_column_str(stmt, idx++, &info->system);
+                       _save_column_str(stmt, idx++, &info->type);
+                       _save_column_str(stmt, idx++, &info->package_size);
+                       _save_column_str(stmt, idx++, &info->installed_time);
+                       _save_column_str(stmt, idx++, &info->storeclient_id);
+                       _save_column_str(stmt, idx++, &info->mainapp_id);
+                       _save_column_str(stmt, idx++, &info->package_url);
+                       _save_column_str(stmt, idx++, &info->root_path);
+                       _save_column_str(stmt, idx++, &info->csc_path);
+                       _save_column_str(stmt, idx++, &info->nodisplay_setting);
+                       _save_column_str(stmt, idx++, &info->api_version);
+                       _save_column_str(stmt, idx++, &info->support_disable);
+                       _save_column_str(stmt, idx++, &info->tep_name);
+                       _save_column_str(stmt, idx++, &info->zip_mount_file);
+                       _save_column_str(stmt, idx++, &info->support_mode);
+               }
+
                info->for_all_users =
-                       strdup((uid != GLOBAL_USER) ? "false" : "true");
+                       strdup((uid != global_user_uid) ? "false" : "true");
 
                if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
                        /* TODO : author should be retrieved at package_localized_info */
@@ -613,10 +598,11 @@ static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
                pkgmgrinfo_pkginfo_filter_add_bool(tmp_filter,
                                PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
 
-       ret = _pkginfo_get_packages(uid, locale, tmp_filter, flag, list);
+       ret = _pkginfo_get_packages(uid, locale, tmp_filter,
+                       flag | PMINFO_PKGINFO_GET_BASICINFO, list);
        if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
                ret = _pkginfo_get_packages(GLOBAL_USER, locale, tmp_filter,
-                               flag, list);
+                               flag | PMINFO_PKGINFO_GET_BASICINFO, list);
 
        if (ret != PMINFO_R_OK) {
                g_hash_table_destroy(list);
@@ -675,7 +661,7 @@ static int _pkgmgrinfo_get_pkginfo(const char *pkgid, uid_t uid,
                                PMINFO_PKGINFO_GET_ALL, list);
 
        if (!g_hash_table_size(list)) {
-               _LOGI("pkginfo for [%s] is not existed for user [%d]",
+               _LOGD("pkginfo for [%s] is not existed for user [%d]",
                                pkgid, uid);
                g_hash_table_destroy(list);
                free(locale);
@@ -804,7 +790,7 @@ API int pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(const char *pkgid,
        }
 
        if (!g_hash_table_size(list)) {
-               _LOGI("disabled pkginfo for [%s] is not existed for user [%d]",
+               _LOGD("disabled pkginfo for [%s] is not existed for user [%d]",
                                pkgid, uid);
                g_hash_table_destroy(list);
                free(locale);
@@ -1526,8 +1512,6 @@ API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable
        val = (char *)info->pkg_info->installlocation;
        if (strcmp(val, "internal-only") == 0)
                *movable = 0;
-       else if (strcmp(val, "prefer-external") == 0)
-               *movable = 1;
        else
                *movable = 1;