Make function for managing speak_data_s 11/266211/9
authorSuyeon Hwang <stom.hwang@samsung.com>
Mon, 26 Apr 2021 06:36:59 +0000 (15:36 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Tue, 15 Feb 2022 06:19:46 +0000 (15:19 +0900)
In previous code, instance of speak_data_s created by ttsd_server.c but destroyed by ttsd_data.c.
This way of memory management is dangerous because invalid memory access can occur by the mistake
of developers.

This patch provides two new function for creating and destroying instance of speak_data_s.
These functions provide safe creation and destruction of the instance.

Change-Id: I016720eccbffd16bdfcb23878573caa1cb9f3115
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
server/ttsd_data.cpp
server/ttsd_data.h
server/ttsd_server.c

index b15346ae6f58fe0c994218c609f4c4718ac775cd..770770ba80cd7b42e96a07b8571b4d80476f014d 100644 (file)
@@ -181,6 +181,17 @@ int ttsd_data_new_client(int pid, unsigned int uid)
        return TTSD_ERROR_NONE;
 }
 
+static inline void __destroy_speak_data(speak_data_s* speak_data)
+{
+       SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)",
+                       speak_data->utt_id, speak_data->text, speak_data->lang, speak_data->vctype, speak_data->speed);
+
+       free(speak_data->text);
+       free(speak_data->lang);
+
+       delete speak_data;
+}
+
 static void __clean_data(app_data_s& app_data)
 {
        int removed_last_uttid = -1;
@@ -189,20 +200,9 @@ static void __clean_data(app_data_s& app_data)
                        continue;
                }
 
-               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)",
-                               speak_data->utt_id, speak_data->text, speak_data->lang, speak_data->vctype, speak_data->speed);
-
-               if (nullptr != speak_data->text) {
-                       free(speak_data->text);
-                       speak_data->text = nullptr;
-               }
-               if (nullptr != speak_data->lang) {
-                       free(speak_data->lang);
-                       speak_data->lang = nullptr;
-               }
                removed_last_uttid = speak_data->utt_id;
 
-               free(speak_data);
+               __destroy_speak_data(speak_data);
                speak_data = nullptr;
        }
 
@@ -472,6 +472,33 @@ int ttsd_data_reset_used_voice(unsigned int uid, ttsd_used_voice_cb callback)
        return TTSD_ERROR_NONE;
 }
 
+speak_data_s* ttsd_data_create_speak_data(const char* text, const char* language, int voice_type, int speed, int utt_id)
+{
+       speak_data_s* speak_data = new speak_data_s();
+       if (nullptr == speak_data) {
+               SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory for speak_data_s");
+               return nullptr;
+       }
+
+       speak_data->text = strdup(text);
+       speak_data->lang = strdup(language);
+
+       speak_data->vctype = voice_type;
+       speak_data->speed = speed;
+       speak_data->utt_id = utt_id;
+
+       return speak_data;
+}
+
+void ttsd_data_destroy_speak_data(speak_data_s* speak_data)
+{
+       if (nullptr == speak_data) {
+               SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] data is nullptr");
+               return;
+       }
+       __destroy_speak_data(speak_data);
+}
+
 int ttsd_data_add_speak_data(unsigned int uid, speak_data_s* data)
 {
        lock_guard<mutex> lock(g_app_data_mutex);
@@ -623,33 +650,6 @@ int ttsd_data_get_sound_data_size(unsigned int uid)
        return app_data->m_wav_data.size();
 }
 
-int ttsd_data_clear_speak_data(speak_data_s** speak_data)
-{
-       if (nullptr == speak_data) {
-               SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] speak_data is nullptr");
-               return TTSD_ERROR_INVALID_PARAMETER;
-       }
-
-       if (nullptr != *speak_data) {
-               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)",
-                               (*speak_data)->utt_id, (*speak_data)->text, (*speak_data)->lang, (*speak_data)->vctype, (*speak_data)->speed);
-
-               if (nullptr != (*speak_data)->text) {
-                       free((*speak_data)->text);
-                       (*speak_data)->text = nullptr;
-               }
-               if (nullptr != (*speak_data)->lang) {
-                       free((*speak_data)->lang);
-                       (*speak_data)->lang = nullptr;
-               }
-
-               free(*speak_data);
-               *speak_data = nullptr;
-       }
-
-       return TTSD_ERROR_NONE;
-}
-
 int ttsd_data_clear_sound_data(sound_data_s** sound_data)
 {
        if (nullptr == sound_data) {
index d7e934dd53e955488ebce0fe486e780b20aff992..b45fd0c15b6638f6b3c6294ad20703adb54d629a 100644 (file)
@@ -86,14 +86,16 @@ int ttsd_data_set_credential(unsigned int uid, const char* credential);
 char* ttsd_data_get_credential(unsigned int uid);
 
 /* speak data */
+speak_data_s* ttsd_data_create_speak_data(const char* text, const char* language, int voice_type, int speed, int utt_id);
+
+void ttsd_data_destroy_speak_data(speak_data_s* speak_data);
+
 int ttsd_data_add_speak_data(unsigned int uid, speak_data_s* data);
 
 int ttsd_data_get_speak_data(unsigned int uid, speak_data_s** data);
 
 int ttsd_data_get_speak_data_size(unsigned int uid);
 
-int ttsd_data_clear_speak_data(speak_data_s** speak_data);
-
 /* sound data */
 int ttsd_data_add_sound_data(unsigned int uid, sound_data_s* data);
 
index 29b55b5b66eea7564a2d89c2b0cb51d9c1f4cd6f..c34482824b05b0b0cb6cd86218450903a3630d50 100644 (file)
@@ -103,6 +103,8 @@ static int __synthesis(unsigned int uid)
                int pid = ttsd_data_get_pid(uid);
                if (pid <= 0) {
                        SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get pid. uid(%u)", uid);
+                       ttsd_data_destroy_speak_data(speak_data);
+                       speak_data = NULL;
                        return -1;
                }
 
@@ -117,7 +119,8 @@ static int __synthesis(unsigned int uid)
 
                        ttsdc_ipc_send_set_state_message(pid, uid, APP_STATE_READY);
 
-                       ttsd_data_clear_speak_data(&speak_data);
+                       ttsd_data_destroy_speak_data(speak_data);
+                       speak_data = NULL;
 
                        return 0;
                }
@@ -156,9 +159,11 @@ static int __synthesis(unsigned int uid)
 
                free(credential);
                credential = NULL;
-               ttsd_data_clear_speak_data(&speak_data);
+               ttsd_data_destroy_speak_data(speak_data);
+               speak_data = NULL;
        } else {
-               ttsd_data_clear_speak_data(&speak_data);
+               ttsd_data_destroy_speak_data(speak_data);
+               speak_data = NULL;
        }
 
        SLOG(LOG_DEBUG, tts_tag(), "@@@ SYNTHESIS  END");
@@ -904,25 +909,17 @@ int ttsd_server_add_queue(unsigned int uid, const char* text, const char* lang,
                return TTSD_ERROR_INVALID_VOICE;
        }
 
-       speak_data_s* speak_data = NULL;
-       speak_data = (speak_data_s*)calloc(1, sizeof(speak_data_s));
+       speak_data_s* speak_data = ttsd_data_create_speak_data(text, lang, voice_type, speed, utt_id);
        if (NULL == speak_data) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to allocate memory");
                if (NULL != temp_lang) {
                        free(temp_lang);
                        temp_lang = NULL;
                }
+
                return TTSD_ERROR_OPERATION_FAILED;
        }
 
-       speak_data->lang = strdup(lang);
-       speak_data->vctype = voice_type;
-
-       speak_data->speed = speed;
-       speak_data->utt_id = utt_id;
-
-       speak_data->text = strdup(text);
-
        SLOG(LOG_INFO, tts_tag(), "[Server] Add queue, lang(%s), vctype(%d), speed(%d), uttid(%d), credential(%s)", lang, voice_type, speed, utt_id, credential);
 
        /* if state is APP_STATE_READY , APP_STATE_PAUSED , only need to add speak data to queue*/
@@ -934,16 +931,9 @@ int ttsd_server_add_queue(unsigned int uid, const char* text, const char* lang,
                        free(temp_lang);
                        temp_lang = NULL;
                }
-               if (NULL != speak_data) {
-                       if (NULL != speak_data->lang)   free(speak_data->lang);
-                       if (NULL != speak_data->text)   free(speak_data->text);
-
-                       speak_data->lang = NULL;
-                       speak_data->text = NULL;
 
-                       free(speak_data);
-                       speak_data = NULL;
-               }
+               ttsd_data_destroy_speak_data(speak_data);
+               speak_data = NULL;
 
                return ret;
        }