From f0f2ed42957eb1af18f8e42a28852974c01dffd9 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Fri, 31 Jan 2020 15:04:16 +0900 Subject: [PATCH 01/16] Fix svace issues Change-Id: Id253e0b2ce5892ef268c4f7465e3f60a06131d66 Signed-off-by: sooyeon.kim --- common/vc_cmd_db.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 62edb6c..310c57e 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -2236,6 +2236,11 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ g_slist_free(cmd_list); SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret); + if (NULL != fixed_cmd) { + free(fixed_cmd); + fixed_cmd = NULL; + } + return ret; } cmd_list = NULL; @@ -2245,7 +2250,11 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ free(fixed_cmd); fixed_cmd = NULL; } - __vc_db_command_destroy((vc_cmd_h)tmp_cmd); + + if (NULL != tmp_cmd) { + SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy"); + __vc_db_command_destroy((vc_cmd_h)tmp_cmd); + } return VC_DB_ERROR_NONE; } -- 2.7.4 From a6d1397aae9f70716b90736f9f80fdcdb58f8d35 Mon Sep 17 00:00:00 2001 From: "wn.jang" Date: Thu, 26 Dec 2019 14:58:36 +0900 Subject: [PATCH 02/16] Remove unnecessary mutex to avoid race condition Change-Id: I7613e04283bd9a4fae40b96130a9e5b8a520a76b (cherry picked from commit a4993d8f5fa24d130de788ef5cb4ee3ccc67db9a) --- common/vc_config_mgr.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/common/vc_config_mgr.c b/common/vc_config_mgr.c index 8dda6b7..76a3bca 100644 --- a/common/vc_config_mgr.c +++ b/common/vc_config_mgr.c @@ -1872,26 +1872,21 @@ bool vc_config_check_default_engine_is_valid(const char* engine) bool vc_config_check_default_language_is_valid(const char* language) { - pthread_mutex_lock(&vc_config_mgr_mutex); if (0 >= g_slist_length(g_config_client_list)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Not initialized"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } if (NULL == language) { - pthread_mutex_unlock(&vc_config_mgr_mutex); return false; } if (NULL == g_config_info->engine_id) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Default engine id is NULL"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return false; } if (0 >= g_slist_length(g_engine_list)) { - pthread_mutex_unlock(&vc_config_mgr_mutex); return false; } @@ -1925,7 +1920,7 @@ bool vc_config_check_default_language_is_valid(const char* language) lang = iter_lang->data; if (0 == strcmp(language, lang)) { - pthread_mutex_unlock(&vc_config_mgr_mutex); + SLOG(LOG_INFO, vc_config_tag(), "[INFO] Default language(%s) is valid", language); return true; } @@ -1935,7 +1930,6 @@ bool vc_config_check_default_language_is_valid(const char* language) break; } - pthread_mutex_unlock(&vc_config_mgr_mutex); return false; } -- 2.7.4 From d2656b5a2447215deb20083781aef33e4bbbb036 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Tue, 4 Feb 2020 16:00:05 +0900 Subject: [PATCH 03/16] Fixed coverity issues Change-Id: Iffa03a06750ce6c229d784b928d6910809e43c2c Signed-off-by: sungrae jo --- common/vc_cmd_db.c | 4 ++++ common/vc_command.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 310c57e..c32971a 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -130,6 +130,7 @@ static int __vc_db_exec_query(sqlite3* db_handle, const char* sql) if (ret != SQLITE_OK) { SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_exec return fail, ret(%d), err(%s)", ret, err_msg); sqlite3_free(err_msg); + err_msg = NULL; return VC_DB_ERROR_OPERATION_FAILED; } return VC_DB_ERROR_NONE; @@ -160,6 +161,7 @@ static int __vc_db_check_table(sqlite3* db_handle, const char* table, bool *is_e if (ret != SQLITE_OK) { SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] sqlite3_get_table return fail, ret(%d), err(%s)", ret, err_msg); sqlite3_free(err_msg); + err_msg = NULL; return VC_DB_ERROR_OPERATION_FAILED; } @@ -1557,6 +1559,8 @@ int __vc_db_open_db_for_daemon(char** path, sqlite3** db_handle) int ret = sqlite3_exec(*db_handle, sql, NULL, NULL, &err_msg); if (ret != SQLITE_OK) { SLOG(LOG_ERROR, vc_db_tag(), "sqlite3_exec returned %d: %s", ret, err_msg); + sqlite3_free(err_msg); + err_msg = NULL; return VC_DB_ERROR_OPERATION_FAILED; } } diff --git a/common/vc_command.c b/common/vc_command.c index 93ff07d..ebd9b8a 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -1986,6 +1986,8 @@ static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist) if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) { SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird"); + free(tempstr); + tempstr = NULL; return VC_ERROR_NONE; } @@ -2017,6 +2019,8 @@ static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist) if (0 > min || 60 <= min) { SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird"); + free(tempstr); + tempstr = NULL; return VC_ERROR_NONE; } -- 2.7.4 From ba9c4d8c2a3205286bb56b0ccdc952212d95f2e2 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 6 Feb 2020 14:14:02 +0900 Subject: [PATCH 04/16] Fixed coverity issues for tts request Change-Id: I5f9a8425e8f07f2d0b29c9b8d6d20a46cda3ac01 Signed-off-by: sungrae jo --- client/vc.c | 4 +-- client/vc_data.cpp | 74 +++++++++++++++++++++++++--------------------- client/vc_data.h | 2 +- server/vcd_server_data.cpp | 9 ++++-- 4 files changed, 50 insertions(+), 39 deletions(-) diff --git a/client/vc.c b/client/vc.c index 467120a..3b21cb0 100644 --- a/client/vc.c +++ b/client/vc.c @@ -2877,7 +2877,6 @@ static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread) { SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread"); - vc_tts_data_s* tts_data = NULL; vc_tts_streaming_cb callback = NULL; void* user_data = NULL; @@ -2892,7 +2891,8 @@ static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread) int cnt = 0; /* get tts data */ - ret = vc_data_get_tts_data(&tts_data); + vc_tts_data_s *tts_data = NULL; + ret = vc_data_get_first_tts_data(&tts_data); if (0 != ret || NULL == tts_data) { /* empty queue */ SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode"); diff --git a/client/vc_data.cpp b/client/vc_data.cpp index 850d2e1..afc475d 100644 --- a/client/vc_data.cpp +++ b/client/vc_data.cpp @@ -38,10 +38,8 @@ int vc_data_add_tts_data(vc_tts_data_s* data) pthread_mutex_lock(&g_tts_data_mutex); - std::list::iterator iter; - try { - iter = g_tts_data.insert(g_tts_data.end(), data); + g_tts_data.push_back(data); } catch (const std::bad_alloc&) { SLOG(LOG_ERROR, TAG_VCC, "[DATA ERROR] Fail to insert tts data (bad alloc)"); pthread_mutex_unlock(&g_tts_data_mutex); @@ -54,27 +52,25 @@ int vc_data_add_tts_data(vc_tts_data_s* data) return VC_ERROR_NONE; } -int vc_data_get_tts_data(vc_tts_data_s** data) +int vc_data_get_first_tts_data(vc_tts_data_s** data) { + if (NULL == data) { + SLOG(LOG_ERROR, TAG_VCC, "[DATA ERROR] tts data is NULL"); + return VC_ERROR_INVALID_PARAMETER; + } + SLOG(LOG_DEBUG, TAG_VCC, "[DATA] tts_data : %p", *data); pthread_mutex_lock(&g_tts_data_mutex); - - if (0 == g_tts_data.size()) { + if (g_tts_data.empty()) { SLOG(LOG_DEBUG, TAG_VCC, "[DATA] There is no tts data"); *data = NULL; pthread_mutex_unlock(&g_tts_data_mutex); - - return -1; + return VC_ERROR_OPERATION_FAILED; } - std::list::iterator iter; - - if (!g_tts_data.empty()) { - iter = g_tts_data.begin(); - *data = *iter; - g_tts_data.pop_front(); - } + *data = g_tts_data.front(); + g_tts_data.pop_front(); pthread_mutex_unlock(&g_tts_data_mutex); @@ -97,19 +93,25 @@ int vc_data_clear_tts_data(vc_tts_data_s** data) { SLOG(LOG_DEBUG, TAG_VCC, "[DATA] clear tts data"); + if (NULL == *data) { + SLOG(LOG_ERROR, TAG_VCC, "[DATA ERROR] tts data is NULL"); + return VC_ERROR_INVALID_PARAMETER; + } + pthread_mutex_lock(&g_tts_data_mutex); - if (NULL != *data) { - SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] event(%d) data(%p) size(%d)", (*data)->event, (*data)->data, (*data)->data_size); + vc_tts_data_s *temp = *data; + SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] event(%d) data(%p) size(%d)", temp->event, temp->data, temp->data_size); - if (NULL != (*data)->data) { - free((*data)->data); - (*data)->data = NULL; - } + if (temp->data) + free(temp->data); + temp->data = NULL; - free(*data); - *data = NULL; - } + if (temp) + free(temp); + temp = NULL; + + *data = NULL; pthread_mutex_unlock(&g_tts_data_mutex); @@ -122,21 +124,27 @@ int vc_data_clear_tts_data_by_uttid(int utt_id) pthread_mutex_lock(&g_tts_data_mutex); - if (g_tts_data.empty()) { + if (g_tts_data.empty()) { SLOG(LOG_ERROR, TAG_VCC, "[DATA ERROR] There is no tts data"); pthread_mutex_unlock(&g_tts_data_mutex); return -1; } std::list::iterator iter; - for (iter = g_tts_data.begin(); (NULL != *iter && iter != g_tts_data.end()); ++iter) { - if (utt_id == (*iter)->utt_id) { - if (NULL != (*iter)->data) { - free((*iter)->data); - (*iter)->data = NULL; - } - g_tts_data.erase(iter); - free(*iter); + iter = g_tts_data.begin(); + while (iter != g_tts_data.end()) { + vc_tts_data_s *temp = nullptr; + temp = *iter; + if (nullptr != temp && utt_id == temp->utt_id) { + iter = g_tts_data.erase(iter); + + if (temp->data) + free(temp->data); + temp->data = nullptr; + free(temp); + temp = nullptr; + } else { + iter++; } } diff --git a/client/vc_data.h b/client/vc_data.h index 9ca9668..2056023 100644 --- a/client/vc_data.h +++ b/client/vc_data.h @@ -39,7 +39,7 @@ typedef struct { int vc_data_add_tts_data(vc_tts_data_s* data); -int vc_data_get_tts_data(vc_tts_data_s** data); +int vc_data_get_first_tts_data(vc_tts_data_s** data); int vc_data_get_tts_data_size(); diff --git a/server/vcd_server_data.cpp b/server/vcd_server_data.cpp index 8100709..6f5906e 100644 --- a/server/vcd_server_data.cpp +++ b/server/vcd_server_data.cpp @@ -124,11 +124,14 @@ int vcd_data_get_tts_text_data(int uid, vc_tts_text_data_s** data) return -1; } - std::list::iterator iter; - for (iter = g_tts_text_data.begin(); (NULL != *iter && iter != g_tts_text_data.end()); ++iter) { + std::list::iterator iter; + iter = g_tts_text_data.begin(); + while (iter != g_tts_text_data.end()) { if (uid == (*iter)->uid) { *data = *iter; - g_tts_text_data.erase(iter); + iter = g_tts_text_data.erase(iter); + } else { + iter++; } } -- 2.7.4 From 7b8772ee82e99e17edba05684b26efd004439b80 Mon Sep 17 00:00:00 2001 From: "wn.jang" Date: Sat, 8 Feb 2020 21:54:39 +0900 Subject: [PATCH 05/16] Fix cynara checking logic Change-Id: Ie02989902a5f5f0ae74c6d14886191d6198df3a6 --- client/vc_mgr.c | 57 +++++++++++++++++++++++++++++++---------------------- common/vc_command.c | 38 ++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 22a145a..7a18e56 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -64,6 +64,8 @@ static int g_daemon_pid = 0; static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; + static cynara *p_cynara = NULL; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -210,35 +212,42 @@ static int __vc_mgr_check_privilege() { pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed"); + g_privilege_allowed = false; + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE, uid); - __check_privilege_deinitialize(); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE, uid); + __check_privilege_deinitialize(); + g_privilege_allowed = false; + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } + + ret = true; + ret = __check_privilege(uid, VC_MGR_PRIVILEGE); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid); + __check_privilege_deinitialize(); + g_privilege_allowed = false; + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - ret = true; - ret = __check_privilege(uid, VC_MGR_PRIVILEGE); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid); __check_privilege_deinitialize(); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; } - __check_privilege_deinitialize(); + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VC_ERROR_NONE; } diff --git a/common/vc_command.c b/common/vc_command.c index ebd9b8a..6319427 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,6 +34,7 @@ #include "voice_control_key_defines.h" static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -132,25 +133,30 @@ static int __vc_cmd_check_privilege() { pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed"); + g_privilege_allowed = false; + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied"); + g_privilege_allowed = false; + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VC_ERROR_NONE; } -- 2.7.4 From d44bc76eb0bef223f03d039912d4724797078422 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Wed, 13 Nov 2019 14:35:39 +0900 Subject: [PATCH 06/16] Add secure option to vc_getengine Change-Id: Ie876da315ef1e32715bb15baaf983a77502fd3a1 Signed-off-by: sooyeon.kim (cherry picked from commit b9190b43567d57ba7085ea403a81d4e5ebe5a793) --- bin/aarch64/vc_getengine | Bin 12464 -> 14632 bytes bin/armv7l/vc_getengine | Bin 8776 -> 9884 bytes bin/i586/vc_getengine | Bin 13852 -> 13856 bytes bin/x86_64/vc_getengine | Bin 14672 -> 14680 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/aarch64/vc_getengine b/bin/aarch64/vc_getengine index 126ccd9184615bc3e1151e8c3dee309863fab7be..476a546d897af5cb3d6940ad640b26b9676a5999 100755 GIT binary patch literal 14632 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 D=!@JP literal 12464 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 KC!(D@*8c*lbA@sM diff --git a/bin/armv7l/vc_getengine b/bin/armv7l/vc_getengine index 570f0cdce3dde6d7291e933066c130cabbb9f13c..7250e29d93426f360c7978d39804f9c76c6802e0 100755 GIT binary patch delta 4434 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 delta 4016 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 VmXdKqPM3^}vrD?*b=EM_@jpdvvAqBQ delta 5006 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 iR$k_@DkW~ds<7o{6()Sd*- Date: Mon, 25 Nov 2019 10:38:27 +0900 Subject: [PATCH 07/16] Fix memory leak issue using g_slist Change-Id: Ib37e5f748ef821eafb53b08e1a4093928ed39311 (cherry picked from commit f75ef72ecd870c338c8e6a1dce2deab589bd55dc) --- server/vcd_server.c | 89 +++++++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/server/vcd_server.c b/server/vcd_server.c index b1d5717..d632034 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -303,6 +303,21 @@ static bool __vcd_is_package_installed(const char* appid) return true; } +void __vc_free_deactivated_app(void* data) +{ + vc_deactivated_app_s* d_app = (vc_deactivated_app_s*)data; + + if (NULL != d_app) { + if (NULL != d_app->appid) { + free(d_app->appid); + d_app->appid = NULL; + } + + free(d_app); + d_app = NULL; + } +} + static bool __vcd_launch_app(const char* result) { if (NULL == result) { @@ -325,54 +340,43 @@ static bool __vcd_launch_app(const char* result) while (NULL != iter) { temp_app = iter->data; - if (NULL != temp_app) { - if (NULL != temp_app->appid) { - int ret = -1; - bool running = false; - ret = app_manager_is_running(temp_app->appid, &running); - if (APP_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to check running with appid(%s)", temp_app->appid); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; - return VCD_ERROR_OPERATION_FAILED; - } - if (false == running) { - int tmp_ret = __vcd_is_package_installed(temp_app->appid); - if (false == tmp_ret) { - SLOG(LOG_WARN, TAG_VCD, "[WARNING] app is not installed, appid(%s)", temp_app->appid); - } else { - ret = __vcd_activate_app_by_appcontrol(temp_app->appid); - if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to activate app"); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; - return ret; - } - SLOG(LOG_ERROR, TAG_VCD, "Launch app: appid(%s) result(%s)", temp_app->appid, result); - } + if (NULL != temp_app && NULL != temp_app->appid) { + int ret = -1; + bool running = false; + ret = app_manager_is_running(temp_app->appid, &running); + if (APP_MANAGER_ERROR_NONE != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to check running with appid(%s)", temp_app->appid); + g_slist_free_full(iter, __vc_free_deactivated_app); + return VCD_ERROR_OPERATION_FAILED; + } + if (false == running) { + int tmp_ret = __vcd_is_package_installed(temp_app->appid); + if (false == tmp_ret) { + SLOG(LOG_WARN, TAG_VCD, "[WARNING] app is not installed, appid(%s)", temp_app->appid); } else { - ret = __vcd_resume_app(temp_app->appid); + ret = __vcd_activate_app_by_appcontrol(temp_app->appid); if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to resume app"); - free(temp_app->appid); - temp_app->appid = NULL; - free(temp_app); - temp_app = NULL; + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to activate app"); + g_slist_free_full(iter, __vc_free_deactivated_app); return ret; } - SLOG(LOG_ERROR, TAG_VCD, "Resume app: appid(%s) result(%s)", temp_app->appid, result); + SLOG(LOG_ERROR, TAG_VCD, "Launch app: appid(%s) result(%s)", temp_app->appid, result); } - free(temp_app->appid); - temp_app->appid = NULL; + } else { + ret = __vcd_resume_app(temp_app->appid); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to resume app"); + g_slist_free_full(iter, __vc_free_deactivated_app); + return ret; + } + SLOG(LOG_ERROR, TAG_VCD, "Resume app: appid(%s) result(%s)", temp_app->appid, result); } - free(temp_app); + __vc_free_deactivated_app((void*)temp_app); temp_app = NULL; } - iter = g_slist_next(iter); + app_list = g_slist_remove_link(app_list, iter); + g_slist_free(iter); + iter = g_slist_nth(app_list, 0); } app_list = NULL; } @@ -409,6 +413,8 @@ static Eina_Bool __vcd_send_selected_result(void *data) ret = vcdc_send_result(temp_cmd->pid, vcd_client_manager_get_pid(), temp_cmd->type); if (0 != ret) { SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send result, ret(%d)", ret); + g_slist_free_full(pid_list, free); + pid_list = NULL; break; } else { SLOG(LOG_ERROR, TAG_VCD, "[Server] Send result : pid(%d) type(%d)", temp_cmd->pid, temp_cmd->type); @@ -420,6 +426,7 @@ static Eina_Bool __vcd_send_selected_result(void *data) temp_cmd = NULL; } pid_list = g_slist_remove_link(pid_list, iter); + g_slist_free(iter); iter = g_slist_nth(pid_list, 0); } } @@ -3268,4 +3275,4 @@ int vcd_set_tts_audio_format_request_cb(vce_tts_audio_format_request_cb callback } return ret; -} +} \ No newline at end of file -- 2.7.4 From c9e5a54f9aefa689372df3a452189d5a6d1087bc Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Wed, 12 Feb 2020 18:51:22 +0900 Subject: [PATCH 08/16] Fixed cynara log Change-Id: I5bae4742308bcfd1039bd28a5e87efaf3dc17d14 Signed-off-by: sungrae jo --- client/vc.c | 6 +++++- client/vc_mgr.c | 5 +++-- common/vc_command.c | 6 +++++- server/vce.c | 6 +++++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/vc.c b/client/vc.c index 3b21cb0..7ee1667 100644 --- a/client/vc.c +++ b/client/vc.c @@ -136,7 +136,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 7a18e56..b20079e 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -202,8 +202,9 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) { - SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] cynara finish"); - cynara_finish(p_cynara); + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret); } p_cynara = NULL; } diff --git a/common/vc_command.c b/common/vc_command.c index 6319427..c0dc496 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -125,7 +125,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } diff --git a/server/vce.c b/server/vce.c index 7825c9a..e9302f3 100644 --- a/server/vce.c +++ b/server/vce.c @@ -101,7 +101,11 @@ static int __check_privilege(const char* uid, const char * privilege) static void __check_privilege_deinitialize() { if (p_cynara) - cynara_finish(p_cynara); + { + int ret = cynara_finish(p_cynara); + if (ret != CYNARA_API_SUCCESS) + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] cynara finish %d", ret); + } p_cynara = NULL; } -- 2.7.4 From 1f9bf314ed63e112028ab0694964faf02225047d Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Mon, 17 Feb 2020 11:03:27 +0900 Subject: [PATCH 09/16] Fix unreachable code Change-Id: I0e4f801860cde9c53ad060ef7d4f168e3a2805c0 Signed-off-by: Suyeon Hwang --- common/vc_cmd_db.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index c32971a..4450794 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -2161,7 +2161,7 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ vc_cmd_s* tmp_cmd = __vc_db_command_copy(cmd); int ret = __vc_db_generate_command(tmp_cmd, &fixed_cmd, &cmd_list); - if (0 != ret) { + if (VC_DB_ERROR_NONE != ret) { SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to generate command, %d", ret); if (NULL != tmp_cmd) { @@ -2191,11 +2191,6 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd); if (ret != VC_DB_ERROR_NONE) { - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - __vc_db_command_destroy((vc_cmd_h)tmp_cmd); break; } @@ -2209,11 +2204,6 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ ret = __vc_db_insert_commands(db_handle, pid, type, tmp_cmd); if (ret != VC_DB_ERROR_NONE) { - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - __vc_db_command_destroy((vc_cmd_h)tmp_cmd); break; } } @@ -2239,14 +2229,8 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ g_slist_free(cmd_list); SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to insert command, %d", ret); - - if (NULL != fixed_cmd) { - free(fixed_cmd); - fixed_cmd = NULL; - } - - return ret; } + cmd_list = NULL; } @@ -2256,10 +2240,12 @@ static int __vc_db_insert_command(sqlite3* db_handle, int pid, vc_cmd_type_e typ } if (NULL != tmp_cmd) { - SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy"); __vc_db_command_destroy((vc_cmd_h)tmp_cmd); + tmp_cmd = NULL; + SLOG(LOG_DEBUG, vc_db_tag(), "[DEBUG] command destroy"); } - return VC_DB_ERROR_NONE; + + return ret; } int vc_db_insert_command(int pid, vc_cmd_type_e type, vc_cmd_s* cmd, bool skip_invocation) -- 2.7.4 From 025ecd988e36bac6e3be88ab2771e645cfd9fdd2 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 17 Feb 2020 21:01:31 +0900 Subject: [PATCH 10/16] Clean up vc_command file. Change-Id: If52823d88ae98b95a6ded59e67621d313a6815ab Signed-off-by: sungrae jo --- common/vc_command.c | 467 ++++++++++++++++++---------------------------------- 1 file changed, 158 insertions(+), 309 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index c0dc496..2446284 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -165,74 +165,6 @@ static int __vc_cmd_check_privilege() return VC_ERROR_NONE; } -static bool __vc_cmd_is_valid(vc_cmd_h vc_command) -{ - if (NULL == g_cmd_list) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid"); - return false; - } - - if (g_list_length(g_cmd_list) == 0) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid"); - return false; - } - - bool flag = false; - vc_cmd_s *command = NULL; - command = (vc_cmd_s *)vc_command; - - GList *iter = NULL; - iter = g_list_first(g_cmd_list); - while (NULL != iter) { - vc_cmd_s *data = NULL; - data = iter->data; - if (NULL != data && command == data) { - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] command(%p) is not valid", command); - - return flag; -} - -static bool __vc_cmd_list_is_valid(vc_cmd_list_h vc_cmd_list) -{ - if (NULL == g_cmdlist_list) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid"); - return false; - } - - if (g_list_length(g_cmdlist_list) == 0) { - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid"); - return false; - } - - bool flag = false; - vc_cmd_list_s *list = NULL; - list = (vc_cmd_list_s *)vc_cmd_list; - - GList *iter = NULL; - iter = g_list_first(g_cmdlist_list); - while (NULL != iter) { - vc_cmd_list_s *data = NULL; - data = iter->data; - if (NULL != data && list == data) { - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) - SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] list(%p) is not valid", list); - - return flag; -} - int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) { if (0 != __vc_cmd_get_feature_enabled()) { @@ -280,11 +212,6 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) return VC_ERROR_INVALID_PARAMETER; } - if (false == __vc_cmd_list_is_valid(vc_cmd_list)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); - return VC_ERROR_INVALID_PARAMETER; - } - vc_cmd_list_remove_all(vc_cmd_list, release_command); vc_cmd_list_s* list = NULL; @@ -293,34 +220,19 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list); GList *iter = NULL; - vc_cmd_list_s *data = NULL; - - /* if list have item */ - if (g_list_length(g_cmdlist_list) > 0) { - /* Get a first item */ - iter = g_list_first(g_cmdlist_list); - - while (NULL != iter) { - data = iter->data; - if (NULL != data && list == data) { - g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); - - free(data); - data = NULL; - - SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); - g_list_free(iter); - iter = NULL; - - return VC_ERROR_NONE; - } - /* Next item */ - iter = g_list_next(iter); - } + iter = g_list_find(g_cmdlist_list, list); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + return VC_ERROR_INVALID_PARAMETER; } - SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); - return VC_ERROR_INVALID_PARAMETER; + g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); + if (iter->data) + free(iter->data); + iter->data = NULL; + iter = NULL; + SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); + return VC_ERROR_NONE; } int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count) @@ -400,41 +312,52 @@ int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd); - vc_cmd_s* temp_cmd = NULL; GSList *iter = NULL; - - iter = g_slist_nth(list->list, 0); - - while (NULL != iter) { - temp_cmd = iter->data; - - if (NULL != temp_cmd && cmd == temp_cmd) { - list->list = g_slist_remove(list->list, temp_cmd); - /* - if (true == release_command) { - SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data"); - if (NULL != temp_cmd->command) free(temp_cmd->command); - if (NULL != temp_cmd->parameter) free(temp_cmd->parameter); - free(temp_cmd); - temp_cmd = NULL; - } - */ - } - - iter = g_slist_next(iter); + iter = g_slist_find(list->list, cmd); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid"); + return VC_ERROR_INVALID_PARAMETER; } - int count = g_slist_length(list->list); + list->list = g_slist_remove_link(list->list, iter); + SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command"); - if (0 == count) { + int len = g_slist_length(list->list); + if (0 == len) list->index = -1; - } else if (list->index == count) { - list->index = count - 1; - } + else if (list->index == len) + list->index = len - 1; return VC_ERROR_NONE; } +static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data) +{ + vc_cmd_s *temp = NULL; + temp = data; + if (temp) { + SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp); + if (temp->command) + free(temp->command); + temp->command = NULL; + if (temp->parameter) + free(temp->parameter); + temp->parameter = NULL; + if (temp->appid) + free(temp->appid); + temp->appid = NULL; + if (temp->invocation_name) + free(temp->invocation_name); + temp->invocation_name = NULL; + if (temp->fixed) + free(temp->fixed); + temp->fixed = NULL; + free(temp); + } + temp = NULL; + return; +} + int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) { if (0 != __vc_cmd_get_feature_enabled()) { @@ -457,25 +380,9 @@ int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)" , list, release_command ? "true" : "false"); - int count = g_slist_length(list->list); - for (int i = 0; i < count ; i++) { - vc_cmd_s *temp_cmd = g_slist_nth_data(list->list, 0); - - if (NULL != temp_cmd) { - list->list = g_slist_remove(list->list, temp_cmd); - - if (true == release_command) { - SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd); - if (NULL != temp_cmd->command) free(temp_cmd->command); - if (NULL != temp_cmd->parameter) free(temp_cmd->parameter); - if (NULL != temp_cmd->appid) free(temp_cmd->appid); - if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name); - if (NULL != temp_cmd->fixed) free(temp_cmd->fixed); - free(temp_cmd); - temp_cmd = NULL; - } - } - } + if (true == release_command) + g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); + g_slist_free(list->list); list->list = NULL; list->index = -1; @@ -501,28 +408,18 @@ int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callb vc_cmd_list_s* list = NULL; list = (vc_cmd_list_s*)vc_cmd_list; - int count = g_slist_length(list->list); - int i ; - GSList *iter = NULL; - vc_cmd_s *temp_cmd; - iter = g_slist_nth(list->list, 0); - - for (i = 0; i < count; i++) { - if (NULL == iter) { + while (NULL != iter) { + vc_cmd_s *temp_cmd = NULL; + temp_cmd = iter->data; + if (NULL == temp_cmd) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); return VC_ERROR_OPERATION_FAILED; } + if (false == callback((vc_cmd_h)temp_cmd, user_data)) + break; - temp_cmd = iter->data; - - if (NULL != temp_cmd) { - if (false == callback((vc_cmd_h)temp_cmd, user_data)) { - break; - } - - } iter = g_slist_next(iter); } @@ -561,56 +458,45 @@ int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* return VC_ERROR_OPERATION_FAILED; } - int count = g_slist_length(list->list); - int i; - GSList *iter = NULL; - vc_cmd_s *iter_cmd; - iter = g_slist_nth(list->list, 0); - - for (i = 0; i < count; i++) { - if (NULL == iter) { + while (NULL != iter) { + vc_cmd_s *iter_cmd = NULL; + iter_cmd = iter->data; + if (NULL == iter_cmd) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); return VC_ERROR_OPERATION_FAILED; } - if (NULL != iter->data) { - iter_cmd = iter->data; - - if (NULL != iter_cmd) { - int iter_type; - if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type"); - continue; - } - if (iter_type == type) { - vc_cmd_h temp_cmd; - if (0 != vc_cmd_create(&temp_cmd)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd"); - continue; - } - - memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s)); - if (NULL != iter_cmd->command) { - ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command); - } - if (NULL != iter_cmd->parameter) { - ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter); - } - - if (0 != vc_cmd_list_add(temp_list, temp_cmd)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add"); - vc_cmd_destroy(temp_cmd); - continue; - } - } + int iter_type = 0; + if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type"); + continue; + } + + if (iter_type == type) { + vc_cmd_h temp_cmd; + if (0 != vc_cmd_create(&temp_cmd)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd"); + continue; + } + + memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s)); + if (NULL != iter_cmd->command) + ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command); + if (NULL != iter_cmd->parameter) + ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter); + + if (0 != vc_cmd_list_add(temp_list, temp_cmd)) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add"); + vc_cmd_destroy(temp_cmd); + continue; } } iter = g_slist_next(iter); } - count = 0; + int count = 0; if (0 != vc_cmd_list_get_count(temp_list, &count)) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count"); } else { @@ -835,67 +721,40 @@ int vc_cmd_destroy(vc_cmd_h vc_command) return VC_ERROR_INVALID_PARAMETER; } - if (false == __vc_cmd_is_valid(vc_command)) { - SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); - return VC_ERROR_INVALID_PARAMETER; - } - vc_cmd_s* command = NULL; command = (vc_cmd_s*)vc_command; SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command); - bool flag = false; GList *iter = NULL; - iter = g_list_first(g_cmd_list); - while (NULL != iter) { - vc_cmd_s *data = NULL; - data = iter->data; - if (NULL != data && command == data) { - g_cmd_list = g_list_remove_link(g_cmd_list, iter); - flag = true; - break; - } - iter = g_list_next(iter); - } - - if (false == flag) { - SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + iter = g_list_find(g_cmd_list, command); + if (NULL == iter) { + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid"); return VC_ERROR_INVALID_PARAMETER; } - if (iter) - g_list_free(iter); - iter = NULL; + g_cmd_list = g_list_remove_link(g_cmd_list, iter); - if (NULL != command) { - if (NULL != command->command) { - free(command->command); - command->command = NULL; - } - if (NULL != command->parameter) { - free(command->parameter); - command->parameter = NULL; - } - if (NULL != command->invocation_name) { - free(command->invocation_name); - command->invocation_name = NULL; - } - if (NULL != command->appid) { - free(command->appid); - command->appid = NULL; - } - if (NULL != command->fixed) { - free(command->fixed); - command->fixed = NULL; - } - if (NULL != command->coordinates) { - free(command->coordinates); - command->coordinates = NULL; - } - free(command); - command = NULL; - } + if (command->command) + free(command->command); + command->command = NULL; + if (command->parameter) + free(command->parameter); + command->parameter = NULL; + if (command->invocation_name) + free(command->invocation_name); + command->invocation_name = NULL; + if (command->appid) + free(command->appid); + command->appid = NULL; + if (command->fixed) + free(command->fixed); + command->fixed = NULL; + if (command->coordinates) + free(command->coordinates); + command->coordinates = NULL; + free(command); + command = NULL; return VC_ERROR_NONE; } @@ -917,10 +776,8 @@ int vc_cmd_set_id(vc_cmd_h vc_command, int id) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd) { - cmd->id = id; - SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id); - } + cmd->id = id; + SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id); return 0; } @@ -942,10 +799,8 @@ int vc_cmd_get_id(vc_cmd_h vc_command, int* id) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd) { - *id = cmd->id; - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id); - } + *id = cmd->id; + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id); return 0; } @@ -969,11 +824,9 @@ int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->appid) { + if (cmd->appid) free(cmd->appid); - cmd->appid = NULL; - } - + cmd->appid = NULL; cmd->appid = strdup(appid); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid); @@ -994,11 +847,13 @@ int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->appid) { + if (cmd->appid) *appid = strdup(gettext(cmd->appid)); - } + else + *appid = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid); + return 0; } @@ -1019,15 +874,10 @@ int vc_cmd_set_command(vc_cmd_h vc_command, const char* command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->command) { + if (cmd->command) free(cmd->command); - } - cmd->command = NULL; - - if (NULL != command) { - cmd->command = strdup(command); - } + cmd->command = strdup(command); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command); @@ -1051,9 +901,10 @@ int vc_cmd_get_command(vc_cmd_h vc_command, char** command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->command) { + if (cmd->command) *command = strdup(gettext(cmd->command)); - } + else + *command = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command); @@ -1069,7 +920,7 @@ int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command) return VC_ERROR_PERMISSION_DENIED; } - if (NULL == vc_command) { + if (NULL == vc_command || NULL == command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter "); return VC_ERROR_INVALID_PARAMETER; } @@ -1077,16 +928,11 @@ int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->parameter) { + if (cmd->parameter) free(cmd->parameter); - } - cmd->parameter = NULL; - - if (NULL != command) { - cmd->parameter = strdup(command); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter); - } + cmd->parameter = strdup(command); + SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter); return 0; } @@ -1105,10 +951,12 @@ int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->parameter) { + if (cmd->parameter) *command = strdup(gettext(cmd->parameter)); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command); - } + else + *command = NULL; + + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command); return 0; } @@ -1132,11 +980,9 @@ int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->fixed) { + if (cmd->fixed) free(cmd->fixed); - cmd->fixed = NULL; - } - + cmd->fixed = NULL; cmd->fixed = strdup(fixed); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed); @@ -1157,10 +1003,12 @@ int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->fixed) { + if (cmd->fixed) *fixed = strdup(gettext(cmd->fixed)); - SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed); - } + else + *fixed = NULL; + + SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed); return 0; } @@ -1184,11 +1032,9 @@ int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->invocation_name) { + if (cmd->invocation_name) free(cmd->invocation_name); - cmd->invocation_name = NULL; - } - + cmd->invocation_name = NULL; cmd->invocation_name = strdup(invocation_name); SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name); @@ -1209,9 +1055,10 @@ int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name) vc_cmd_s* cmd = NULL; cmd = (vc_cmd_s*)vc_command; - if (NULL != cmd->invocation_name) { + if (cmd->invocation_name) *invocation_name = strdup(gettext(cmd->invocation_name)); - } + else + *invocation_name = NULL; SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name); return 0; @@ -1483,18 +1330,20 @@ int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list) SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @"); SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list); - int count = g_slist_length(list->list); - - int i; - vc_cmd_s *cmd = NULL; - - for (i = 0; i < count ; i++) { - cmd = g_slist_nth_data(list->list, i); - - if (NULL != cmd) { - SLOG(LOG_DEBUG, TAG_VCCMD, " [%d][%p] PID(%d) ID(%d) Type(%d) Format(%d) Command(%s) Param(%s) Appid(%s) Invocation(%s) Fixed(%s)", - i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed); + int i = 0; + GSList *iter = NULL; + iter = g_slist_nth(list->list, 0); + while (NULL != iter) { + vc_cmd_s *cmd = NULL; + cmd = iter->data; + if (NULL == cmd) { + SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list"); + return VC_ERROR_OPERATION_FAILED; } + SLOG(LOG_DEBUG, TAG_VCCMD, " [%d][%p] PID(%d) ID(%d) Type(%d) Format(%d) Command(%s) Param(%s) Appid(%s) Invocation(%s) Fixed(%s)", + i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed); + + iter = g_slist_next(iter); } SLOG(LOG_DEBUG, TAG_VCCMD, "@@@"); -- 2.7.4 From e6032ff63ee71c9eb76a0cd639a271563d1319d2 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Tue, 18 Feb 2020 10:32:32 +0900 Subject: [PATCH 11/16] Fix double locking issue Change-Id: I8d825919a361e0f42c172ae0d9e3f618de081256 Signed-off-by: Suyeon Hwang --- common/vc_config_mgr.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/common/vc_config_mgr.c b/common/vc_config_mgr.c index 76a3bca..2a34402 100644 --- a/common/vc_config_mgr.c +++ b/common/vc_config_mgr.c @@ -73,6 +73,7 @@ static pthread_mutex_t vc_config_engine_mutex = PTHREAD_MUTEX_INITIALIZER; static int __vc_config_mgr_register_engine_config_updated_event(const char* path); static int __vc_config_mgr_unregister_engine_config_updated_event(); +static int __vc_config_mgr_set_default_language(const char* language); int __vc_config_mgr_print_engine_info(); int __vc_config_mgr_print_client_info(); @@ -464,7 +465,7 @@ static Eina_Bool __vc_config_mgr_engine_config_inotify_event_callback(void* data SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get language"); } - ret = vc_config_mgr_set_default_language(temp_lang); + ret = __vc_config_mgr_set_default_language(temp_lang); if (0 != ret) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to set language"); } else { @@ -1705,17 +1706,14 @@ int vc_config_mgr_get_default_language(char** language) return 0; } -int vc_config_mgr_set_default_language(const char* language) +static int __vc_config_mgr_set_default_language(const char* language) { - pthread_mutex_lock(&vc_config_mgr_mutex); if (0 >= g_slist_length(g_config_client_list)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Not initialized"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } if (NULL == language) { - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } @@ -1723,21 +1721,27 @@ int vc_config_mgr_set_default_language(const char* language) if (NULL != g_config_info->language) { if (0 != vc_parser_set_language(language)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to save engine id"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } free(g_config_info->language); g_config_info->language = strdup(language); } else { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] language is NULL"); - pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } - pthread_mutex_unlock(&vc_config_mgr_mutex); return 0; } +int vc_config_mgr_set_default_language(const char* language) +{ + pthread_mutex_lock(&vc_config_mgr_mutex); + int ret = __vc_config_mgr_set_default_language(language); + pthread_mutex_unlock(&vc_config_mgr_mutex); + + return ret; +} + int vc_config_mgr_get_enabled(bool* value) { pthread_mutex_lock(&vc_config_mgr_mutex); -- 2.7.4 From f38527d857a2ae505ea6988d9a94642b0188d358 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Tue, 18 Feb 2020 13:37:05 +0900 Subject: [PATCH 12/16] Added no-repeat code for privilege Change-Id: Id53d6203e1c3b25d94b35c19061b25a689675a90 Signed-off-by: sungrae jo --- client/vc.c | 39 +++++++++++++++++++++++---------------- client/vc_mgr.c | 3 +++ common/vc_command.c | 5 ++++- server/vce.c | 40 ++++++++++++++++++++++++---------------- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/client/vc.c b/client/vc.c index 7ee1667..cd57765 100644 --- a/client/vc.c +++ b/client/vc.c @@ -54,6 +54,7 @@ static vc_h g_vc = NULL; static int g_daemon_pid = 0; static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; static bool g_backup = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -146,27 +147,33 @@ static void __check_privilege_deinitialize() static int __vc_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VC_ERROR_NONE; } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index b20079e..eb6c3b8 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -211,6 +211,9 @@ static void __check_privilege_deinitialize() static int __vc_mgr_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/common/vc_command.c b/common/vc_command.c index 2446284..0d22bc5 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,7 +34,7 @@ #include "voice_control_key_defines.h" static int g_feature_enabled = -1; -static bool g_privilege_allowed = false; +static bool g_privilege_allowed = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -135,6 +135,9 @@ static void __check_privilege_deinitialize() static int __vc_cmd_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/server/vce.c b/server/vce.c index e9302f3..970f521 100644 --- a/server/vce.c +++ b/server/vce.c @@ -26,6 +26,8 @@ #include "vce.h" static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; + static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -111,27 +113,33 @@ static void __check_privilege_deinitialize() static int __vce_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VCE_ERROR_NONE; } -- 2.7.4 From 375b93bf6a29ff6572cc948b0877d814c8019fc9 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Tue, 18 Feb 2020 14:33:36 +0900 Subject: [PATCH 13/16] Add a null checker Change-Id: If9508e574b0466d0f46217a9a3cc26d552dbde0d Signed-off-by: sooyeon.kim --- common/vc_json_parser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/vc_json_parser.c b/common/vc_json_parser.c index 65957db..d6be245 100644 --- a/common/vc_json_parser.c +++ b/common/vc_json_parser.c @@ -184,7 +184,9 @@ static int __vc_json_set_commands(JsonObject *root_obj, int type, char* invocati cmd->domain = temp; temp_text = json_object_get_string_member(object, "cmd"); - cmd->command = strdup(temp_text); + if (NULL != temp_text) + cmd->command = strdup(temp_text); + if (NULL == cmd->command) { SLOG(LOG_ERROR, vc_json_tag(), "[ERROR] Fail to allocate memory"); free(temp_type); -- 2.7.4 From 2ce48a5f8010ed55dcd963c95f00b97ed0f57ebe Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Wed, 19 Feb 2020 13:28:54 +0900 Subject: [PATCH 14/16] Using vc_cmd_destory in remove_all_foreach function. Change-Id: I51780aadfd55a5ef36626f0ac56ab2f6ccc8e93d Signed-off-by: sungrae jo --- common/vc_command.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index 0d22bc5..8ff7138 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -340,24 +340,9 @@ static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data) temp = data; if (temp) { SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp); - if (temp->command) - free(temp->command); - temp->command = NULL; - if (temp->parameter) - free(temp->parameter); - temp->parameter = NULL; - if (temp->appid) - free(temp->appid); - temp->appid = NULL; - if (temp->invocation_name) - free(temp->invocation_name); - temp->invocation_name = NULL; - if (temp->fixed) - free(temp->fixed); - temp->fixed = NULL; - free(temp); - } - temp = NULL; + vc_cmd_destroy((vc_cmd_h)temp); + temp = NULL; + } return; } -- 2.7.4 From c76b16ebf05b886983371bfbaf41918aaccb4959 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 20 Feb 2020 11:07:46 +0900 Subject: [PATCH 15/16] Fixed vce option callback in vce_main Change-Id: Ica044b049d524c4e5ee1597428040e1acc81a58f Signed-off-by: sungrae jo --- include/vce.h | 2 +- server/vcd_engine_agent.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/vce.h b/include/vce.h index b73fabd..31747a0 100644 --- a/include/vce.h +++ b/include/vce.h @@ -627,7 +627,7 @@ typedef int (*vce_tts_audio_format_request_cb)(int* rate, int* channel, int* aud * @brief A structure for the VC engine functions. * @details This structure contains essential callback functions for operating VC engine. * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif - * @remarks These functions ar mandatory for operating VC engine. Therefore, all functions MUST be implemented. + * @remarks You must register all callbacks except optional callbacks for operating VC engine. */ typedef struct { int version; /**< Version */ diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 345959f..4750284 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -231,10 +231,11 @@ static int __internal_get_engine_info(vce_request_callback_s* callback) g_dynamic_engine.callbacks->process_list_event = callback->process_list_event; g_dynamic_engine.callbacks->process_haptic_event = callback->process_haptic_event; - g_dynamic_engine.callbacks->private_data_set = NULL; - g_dynamic_engine.callbacks->private_data_request = NULL; - g_dynamic_engine.callbacks->nlu_base_info_request = NULL; - g_dynamic_engine.callbacks->specific_engine_request = NULL; + g_dynamic_engine.callbacks->private_data_set = callback->private_data_set; + g_dynamic_engine.callbacks->private_data_request = callback->private_data_request; + g_dynamic_engine.callbacks->nlu_base_info_request = callback->nlu_base_info_request; + g_dynamic_engine.callbacks->specific_engine_request = callback->specific_engine_request; + g_dynamic_engine.internal_callbacks->request_tts = NULL; g_dynamic_engine.internal_callbacks->request_tts_user_data = NULL; g_dynamic_engine.internal_callbacks->cancel_tts = NULL; -- 2.7.4 From b846bfc33e9a058095865ae9722d5e2fdd2714d2 Mon Sep 17 00:00:00 2001 From: Dharanie Shankar Date: Mon, 17 Feb 2020 11:55:38 +0530 Subject: [PATCH 16/16] Memory leak fixes taken from MCD 4.0 Change refno: 3284633, 3316074, 3316388 [Model] [BinType] AP [Customer] OPEN [Issue#] [Request] PLM [Occurrence Version] [Problem] bug fix [Cause & Measure] [Checking Method] [Team] Bixby Client [Developer] Dharanie Shankar [Solution company] Samsung [Change Type] PLM Change-Id: Ia9d500d6e6030a2c2caeba8854ff96530aca4238 Signed-off-by: Dharanie Shankar (cherry picked from commit 8db9160f0cbfa62afbf8da366033f7ec41640d70) --- client/vc_mgr.c | 8 ++++++++ client/vc_mgr_data.cpp | 18 ++++++++---------- common/vc_config_parser.c | 2 ++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index eb6c3b8..855c6f9 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -4194,6 +4194,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } else { @@ -4220,6 +4224,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish vc tts feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } diff --git a/client/vc_mgr_data.cpp b/client/vc_mgr_data.cpp index 53adae3..8301fcd 100644 --- a/client/vc_mgr_data.cpp +++ b/client/vc_mgr_data.cpp @@ -100,18 +100,16 @@ int vc_mgr_data_clear_feedback_data(vc_feedback_data_s** data) pthread_mutex_lock(&g_feedback_data_mutex); - if (!g_feedback_data.empty()) { - if (NULL != *data) { - SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - - if (NULL != (*data)->data) { - free((*data)->data); - (*data)->data = NULL; - } + if (NULL != *data) { + SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - free(*data); - *data = NULL; + if (NULL != (*data)->data) { + free((*data)->data); + (*data)->data = NULL; } + + free(*data); + *data = NULL; } pthread_mutex_unlock(&g_feedback_data_mutex); diff --git a/common/vc_config_parser.c b/common/vc_config_parser.c index e2be6d8..cf7e088 100644 --- a/common/vc_config_parser.c +++ b/common/vc_config_parser.c @@ -243,6 +243,8 @@ int vc_parser_free_engine_info(vc_engine_info_s* engine_info) if (NULL != engine_info->name) free(engine_info->name); if (NULL != engine_info->uuid) free(engine_info->uuid); + if (NULL != engine_info->default_lang) free(engine_info->default_lang); + if (NULL != engine_info->setting) free(engine_info->setting); int count = g_slist_length(engine_info->languages); -- 2.7.4