Fix static analysis issue
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_pkginfo.c
index d7a6a52..dc3048a 100644 (file)
@@ -253,6 +253,11 @@ static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
                privilege = calloc(1, sizeof(privilege_x));
+               if (!privilege) {
+                       LOGE("failed to alloc memory");
+                       sqlite3_finalize(stmt);
+                       return PMINFO_R_ERROR;
+               }
                _save_column_str(stmt, 0, &privilege->value);
                _save_column_str(stmt, 1, &privilege->type);
                *privileges = g_list_append(*privileges,
@@ -311,14 +316,22 @@ static int _pkginfo_get_appdefined_privilege(sqlite3 *db, const char *pkgid,
 static int _pkginfo_get_dependency(sqlite3 *db, const char *pkgid,
                GList **dependencies)
 {
-       static const char query[] =
+       static const char query_raw[] =
                "SELECT DISTINCT depends_on, type, required_version "
-               "FROM package_dependency_info WHERE package=?";
+               "FROM package_dependency_info WHERE package=%Q";
        int ret;
+       char *query;
        sqlite3_stmt *stmt;
        dependency_x *dependency;
 
+       query = sqlite3_mprintf(query_raw, pkgid);
+       if (query == NULL) {
+               LOGE("out of memory");
+               return PMINFO_R_ERROR;
+       }
+
        ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       sqlite3_free(query);
        if (ret != SQLITE_OK) {
                LOGE("prepare failed: %s", sqlite3_errmsg(db));
                return PMINFO_R_ERROR;
@@ -2154,7 +2167,8 @@ API int pkgmgrinfo_pkginfo_foreach_dependency(pkgmgrinfo_pkginfo_h handle,
                dependency = (dependency_x *)tmp->data;
                if (dependency == NULL)
                        continue;
-               ret = dependency_cb(dependency->depends_on, dependency->type,
+               ret = dependency_cb(info->pkg_info->package,
+                               dependency->depends_on, dependency->type,
                                dependency->required_version, user_data);
                if (ret < 0)
                        break;
@@ -2163,21 +2177,22 @@ API int pkgmgrinfo_pkginfo_foreach_dependency(pkgmgrinfo_pkginfo_h handle,
        return PMINFO_R_OK;
 }
 
-struct required_by {
-       char *pkgid;
+struct depends_on {
+       char *from;
+       char *to;
        char *type;
        char *version;
 };
 
-static int _get_required_by(sqlite3 *db, const char *pkgid, GQueue **queue,
+static int _get_depends_on(sqlite3 *db, const char *pkgid, GQueue **queue,
                GHashTable **table, GList **pkg_list)
 {
        static const char query[] =
-               "SELECT package, type, required_version "
+               "SELECT package, depends_on, type, required_version "
                "FROM package_dependency_info WHERE depends_on=?";
        int ret;
        sqlite3_stmt *stmt;
-       struct required_by *req;
+       struct depends_on *req;
 
        /* already checked */
        if (!g_hash_table_insert(*table, strdup(pkgid), GINT_TO_POINTER(1)))
@@ -2197,18 +2212,19 @@ static int _get_required_by(sqlite3 *db, const char *pkgid, GQueue **queue,
        }
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
-               req = calloc(1, sizeof(struct required_by));
+               req = calloc(1, sizeof(struct depends_on));
                if (req == NULL) {
                        LOGE("out of memory");
                        sqlite3_finalize(stmt);
                        return PMINFO_R_ERROR;
                }
-               _save_column_str(stmt, 0, &req->pkgid);
-               _save_column_str(stmt, 1, &req->type);
-               _save_column_str(stmt, 2, &req->version);
+               _save_column_str(stmt, 0, &req->from);
+               _save_column_str(stmt, 1, &req->to);
+               _save_column_str(stmt, 2, &req->type);
+               _save_column_str(stmt, 3, &req->version);
 
                *pkg_list = g_list_append(*pkg_list, req);
-               g_queue_push_tail(*queue, strdup(req->pkgid));
+               g_queue_push_tail(*queue, strdup(req->from));
        }
 
        sqlite3_finalize(stmt);
@@ -2216,7 +2232,7 @@ static int _get_required_by(sqlite3 *db, const char *pkgid, GQueue **queue,
        return PMINFO_R_OK;
 }
 
-static int _pkginfo_foreach_required_by(uid_t uid, const char *pkgid,
+static int _pkginfo_foreach_depends_on(uid_t uid, const char *pkgid,
                GList **pkg_list)
 {
        int ret;
@@ -2250,10 +2266,10 @@ static int _pkginfo_foreach_required_by(uid_t uid, const char *pkgid,
        g_queue_push_tail(queue, strdup(pkgid));
        while (!g_queue_is_empty(queue)) {
                item = g_queue_pop_head(queue);
-               ret = _get_required_by(db, item, &queue, &table, pkg_list);
+               ret = _get_depends_on(db, item, &queue, &table, pkg_list);
                free(item);
                if (ret != PMINFO_R_OK) {
-                       LOGE("failed to get required by pkgs");
+                       LOGE("failed to get pkgs depends on %s", pkgid);
                        g_hash_table_destroy(table);
                        g_queue_free_full(queue, free);
                        sqlite3_close_v2(db);
@@ -2268,17 +2284,18 @@ static int _pkginfo_foreach_required_by(uid_t uid, const char *pkgid,
        return PMINFO_R_OK;
 }
 
-static void __free_required_by(gpointer data)
+static void __free_depends_on(gpointer data)
 {
-       struct required_by *req = (struct required_by *)data;
+       struct depends_on *dep = (struct depends_on *)data;
 
-       free(req->pkgid);
-       free(req->type);
-       free(req->version);
-       free(req);
+       free(dep->from);
+       free(dep->to);
+       free(dep->type);
+       free(dep->version);
+       free(dep);
 }
 
-API int pkgmgrinfo_pkginfo_foreach_required_by(pkgmgrinfo_pkginfo_h handle,
+API int pkgmgrinfo_pkginfo_foreach_depends_on(pkgmgrinfo_pkginfo_h handle,
                pkgmgrinfo_pkg_dependency_list_cb dependency_cb,
                void *user_data)
 {
@@ -2286,33 +2303,33 @@ API int pkgmgrinfo_pkginfo_foreach_required_by(pkgmgrinfo_pkginfo_h handle,
        pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
        GList *pkg_list = NULL;
        GList *l;
-       struct required_by *req;
+       struct depends_on *dep;
 
        if (handle == NULL || dependency_cb == NULL || info->pkg_info == NULL) {
                LOGE("invalid parameter");
                return PMINFO_R_EINVAL;
        }
 
-       ret = _pkginfo_foreach_required_by(info->uid, info->pkg_info->package,
+       ret = _pkginfo_foreach_depends_on(info->uid, info->pkg_info->package,
                        &pkg_list);
        if (ret == PMINFO_R_OK && info->uid != GLOBAL_USER)
-               ret = _pkginfo_foreach_required_by(GLOBAL_USER,
+               ret = _pkginfo_foreach_depends_on(GLOBAL_USER,
                                info->pkg_info->package, &pkg_list);
 
        if (ret != PMINFO_R_OK) {
-               g_list_free_full(pkg_list, __free_required_by);
+               g_list_free_full(pkg_list, __free_depends_on);
                return ret;
        }
 
        for (l = pkg_list; l != NULL; l = l->next) {
-               req = (struct required_by *)l->data;
-               ret = dependency_cb(req->pkgid, req->type, req->version,
+               dep = (struct depends_on *)l->data;
+               ret = dependency_cb(dep->from, dep->to, dep->type, dep->version,
                                user_data);
                if (ret < 0)
                        break;
        }
 
-       g_list_free_full(pkg_list, __free_required_by);
+       g_list_free_full(pkg_list, __free_depends_on);
 
        return PMINFO_R_OK;
 }