Fix 'sql_str' memory leak if 'handle' is null or 'sql_str' is empty string 96/239096/3
authorjiyong.min <jiyong.min@samsung.com>
Tue, 21 Jul 2020 23:23:40 +0000 (08:23 +0900)
committerJiyong Min <jiyong.min@samsung.com>
Wed, 22 Jul 2020 01:59:55 +0000 (01:59 +0000)
Change-Id: I00febeb6285b7b37c6ae3dbb991f75dcb05d7dd3

src/media_controller_db.c

index f10ff74..8fc20fa 100644 (file)
@@ -27,7 +27,7 @@ static int __mc_db_update_db(mc_priv_type_e priv_type, const char *sql_str)
        return _mc_ipc_send_message_to_server(MC_MSG_DB_UPDATE, priv_type, sql_str);
 }
 
-static int __mc_db_get_record(sqlite3 *handle, char *sql_str, sqlite3_stmt **stmt)
+static int __mc_db_get_record(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
 {
        int ret = SQLITE_OK;
        sqlite3_stmt *statement = NULL;
@@ -37,7 +37,6 @@ static int __mc_db_get_record(sqlite3 *handle, char *sql_str, sqlite3_stmt **stm
        mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "SQL string is null");
 
        ret = sqlite3_prepare_v2(handle, sql_str, strlen(sql_str), &statement, NULL);
-       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != SQLITE_OK, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "prepare error [%s]", sqlite3_errmsg(handle));
 
        if (sqlite3_step(statement) != SQLITE_ROW) {
@@ -65,6 +64,7 @@ static int __mc_db_get_int_value(sqlite3 *handle, const char *server_name, const
        sql_str = sqlite3_mprintf("SELECT %q FROM %q WHERE name=%Q", column, MC_DB_TABLE_SERVER_INFO, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
 
        *value = sqlite3_column_int(stmt, 0);
@@ -205,6 +205,7 @@ int _mc_db_get_latest_server_info(sqlite3 *handle, char **latest_server_name, mc
 
        sql_str = sqlite3_mprintf("SELECT name, server_state FROM %q WHERE name IN (SELECT name FROM %q)", MC_DB_TABLE_SERVER_INFO, MC_DB_TABLE_LATEST_SERVER);
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        if (ret == MEDIA_CONTROLLER_ERROR_NONE) {
                *latest_server_name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
                *state = sqlite3_column_int(stmt, 1);
@@ -234,6 +235,7 @@ int _mc_db_get_playback_info(sqlite3 *handle, const char *server_name, mc_playba
                MC_DB_TABLE_SERVER_INFO, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
 
        _playback = g_new0(media_controller_playback_s, 1);
@@ -293,6 +295,7 @@ int _mc_db_get_metadata_info(sqlite3 *handle, const char *server_name, mc_metada
        sql_str = sqlite3_mprintf("SELECT %s FROM %q WHERE name=%Q", META_LIST, MC_DB_TABLE_LATEST_META, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret == TIZEN_ERROR_NO_DATA, MEDIA_CONTROLLER_ERROR_NONE, "no metadata info");
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "__mc_db_get_record failed [%d]", ret);
 
@@ -323,6 +326,7 @@ int _mc_db_get_icon_uri(sqlite3 *handle, const char *server_name, char **uri)
        sql_str = sqlite3_mprintf("SELECT icon_uri FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
 
        *uri = g_strdup((const char *)sqlite3_column_text(stmt, 0));
@@ -344,6 +348,7 @@ static int __mc_db_get_ability(sqlite3 *handle, const char *server_name, unsigne
        sql_str = sqlite3_mprintf("SELECT ability_decided, ability_supported FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
 
        *decided = (unsigned long long)sqlite3_column_int64(stmt, 0);
@@ -474,6 +479,7 @@ int _mc_db_get_playlist_count(sqlite3 *handle, const char *server_name)
        sql_str = sqlite3_mprintf("SELECT COUNT(DISTINCT playlist_name) FROM %q WHERE server_name = %Q", MC_DB_TABLE_PLAYLIST, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, 0, "__mc_db_get_record failed [%d]", ret);
 
        count = sqlite3_column_int(stmt, 0);
@@ -531,6 +537,7 @@ gboolean _mc_db_is_playlist_exist(sqlite3 *handle, const char *server_name, cons
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE server_name=%Q AND playlist_name=%Q", MC_DB_TABLE_PLAYLIST, server_name, playlist_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "__mc_db_get_record failed [%d]", ret);
 
        ret = sqlite3_column_int(stmt, 0);
@@ -576,6 +583,7 @@ int _mc_db_get_playlist_item_count(sqlite3 *handle, const char *server_name, cha
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE server_name=%Q AND playlist_name=%Q AND item_index IS NOT NULL", MC_DB_TABLE_PLAYLIST, server_name, playlist_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, 0, "__mc_db_get_record failed [%d]", ret);
 
        count = sqlite3_column_int(stmt, 0);
@@ -642,6 +650,7 @@ gboolean _mc_db_is_exist_server(sqlite3 *handle, const char *server_name)
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE name='%q'", MC_DB_TABLE_SERVER_INFO, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "__mc_db_get_record failed [%d]", ret);
 
        ret = sqlite3_column_int(stmt, 0);
@@ -669,6 +678,7 @@ gboolean _mc_db_is_activated_client(sqlite3 *handle, const char *client_name)
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE name='%q' AND type=%d", MC_DB_TABLE_APP_LIST, client_name, MC_PRIV_TYPE_CLIENT);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "__mc_db_get_record failed [%d]", ret);
 
        ret = sqlite3_column_int(stmt, 0);
@@ -696,6 +706,7 @@ gboolean _mc_db_is_activated_server(sqlite3 *handle, const char *server_name)
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE name='%q' AND type=%d", MC_DB_TABLE_APP_LIST, server_name, MC_PRIV_TYPE_SERVER);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "__mc_db_get_record failed [%d]", ret);
 
        ret = sqlite3_column_int(stmt, 0);
@@ -723,6 +734,7 @@ gboolean _mc_db_is_latest_server(sqlite3 *handle, const char *server_name)
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE name=%Q", MC_DB_TABLE_LATEST_SERVER, server_name);
 
        ret = __mc_db_get_record(handle, sql_str, &stmt);
+       SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "__mc_db_get_record failed [%d]", ret);
 
        ret = sqlite3_column_int(stmt, 0);