Fix potential memory leak 30/238930/1
authorYunjin Lee <yunjin-.lee@samsung.com>
Mon, 20 Jul 2020 10:05:17 +0000 (19:05 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Mon, 20 Jul 2020 10:08:55 +0000 (19:08 +0900)
- If TRY_INIT_DB fails, string allocated by __make_privilege_list_str()
will be lost.

Change-Id: I2d7e3b9ccb6b1cf3bd4d1e18a33d6e60f9acbaeb
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
capi/src/privilege_db_manager.c
capi/src/privilege_info.c

index cb3eebf9201f65714b831117d9c4a96189749220..39fe2f15fa52277d3db3ddc2e39d1febd2b96c48 100755 (executable)
@@ -243,15 +243,12 @@ int privilege_db_manager_check_black_list(uid_t uid, privilege_manager_package_t
        int ret = 0;
        int count = 0;
 
-       char *privilege_list_str = NULL;
-       ret = __make_privilege_list_str(privilege_list, &privilege_list_str);
-       if (ret == -1) {
-               _LOGE("__make_privilege_list_str() failed.");
-               return PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY;
-       }
-
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_POLICY_RO, &db);
 
+       char *privilege_list_str = NULL;
+    ret = __make_privilege_list_str(privilege_list, &privilege_list_str);
+    TryReturn(ret == 0 && privilege_list_str != NULL, sqlite3_close(db), PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY, "[PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY] making privilege_list_str for where in query is failed.");
+
        char *sql = sqlite3_mprintf("select distinct privilege_name from prevent_list where privilege_name in(%s)and (uid=%d or uid=%d) and package_type=%d", privilege_list_str, uid, GLOBAL_USER, package_type);
        sqlite3_free(privilege_list_str);
 
@@ -314,19 +311,18 @@ int privilege_db_manager_get_mapped_privilege_list(const char *api_version, priv
        sqlite3_stmt *stmt = NULL;
        int ret;
 
-       GList *temp_privilege_list = NULL;
+       TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
 
        char *privilege_list_str = NULL;
        ret = __make_privilege_list_str(privilege_list, &privilege_list_str);
        TryReturn(ret == 0 && privilege_list_str != NULL, sqlite3_close(db), PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY, "[PRIVILEGE_DB_MANAGER_ERR_OUT_OF_MEMORY] making privilege_list_str for where in query is failed.");
 
-       TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
-
        char *sql =  sqlite3_mprintf("select distinct mapped_privilege_name from privilege_mapping where package_type_id=%d and privilege_name in(%s) and from_api_version<=%Q and to_api_version>%Q", package_type, privilege_list_str, api_version, api_version, package_type);
        sqlite3_free(privilege_list_str);
 
        TRY_PREPARE_STMT(db, sql, &stmt);
 
+       GList *temp_privilege_list = NULL;
        do {
                ret = sqlite3_step(stmt);
                if (ret == SQLITE_ROW) {
@@ -575,6 +571,7 @@ int privilege_db_manager_is_disabled_privilege(uid_t uid, const char* privilege)
 {
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
+
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_POLICY_RO, &db);
 
        char *sql = sqlite3_mprintf("select * from disable_list where privilege_name=%Q and (uid=%d or uid=%d)", privilege, uid, GLOBAL_USER);
@@ -680,6 +677,7 @@ int privilege_db_manager_get_same_privacy_grouped_privileges(const char* privile
        sqlite3 *db = NULL;
        sqlite3_stmt *stmt = NULL;
        int ret;
+
        TRY_INIT_DB(PRIVILEGE_DB_TYPE_INFO, &db);
 
        char *sql = sqlite3_mprintf("select distinct privilege_name from privilege_info where privacy_name=(select distinct privacy_name from privilege_info where privilege_name=%Q and is_privacy=1)", privilege);
index 45bc379c90448840b2ecd8b5a5186536a13540e6..8f284fa8a4464a7a3d60ba395e5e8936766d67ed 100755 (executable)
@@ -530,10 +530,10 @@ static privilege_manager_visibility_e __get_pkg_cert_level(uid_t uid, const char
        CertSvcVisibility visibility = CERTSVC_VISIBILITY_PUBLIC;
 
        ret = certsvc_instance_new(&instance);
-       TryReturn(ret == CERTSVC_SUCCESS, , PRVMGR_PACKAGE_VISIBILITY_NONE, "certsvc_instance_new() failed. ret = %d", ret);
+       TryReturn(ret == CERTSVC_SUCCESS, g_free(temp_cert), PRVMGR_PACKAGE_VISIBILITY_NONE, "certsvc_instance_new() failed. ret = %d", ret);
 
        ret = certsvc_certificate_new_from_memory(instance, (const unsigned char *)temp_cert, strlen(temp_cert), CERTSVC_FORM_DER_BASE64, &certificate);
-       TryReturn(ret == CERTSVC_SUCCESS, certsvc_instance_free(instance), PRVMGR_PACKAGE_VISIBILITY_NONE, "certsvc_certificate_new_from_memory() failed. ret = %d", ret);
+       TryReturn(ret == CERTSVC_SUCCESS, g_free(temp_cert); certsvc_instance_free(instance), PRVMGR_PACKAGE_VISIBILITY_NONE, "certsvc_certificate_new_from_memory() failed. ret = %d", ret);
 
        g_free(temp_cert);