Merge remote-tracking branch 'origin/tizen_3.0' into tizen 14/117914/1
authorWonnam Jang <wn.jang@samsung.com>
Wed, 8 Mar 2017 04:33:19 +0000 (13:33 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Wed, 8 Mar 2017 04:35:20 +0000 (13:35 +0900)
Conflicts:
client/tts_dbus.c
common/tts_config_mgr.c
common/tts_config_parser.c
engine-parser/src/tts-engine-parser.c
server/ttsd_data.cpp
server/ttsd_dbus.c

Change-Id: I3c402f69af42e38cd6c7810ab3f8792a501d39bb

1  2 
common/tts_config_mgr.c
server/ttsd_dbus.c
server/ttsd_server.c

diff --combined common/tts_config_mgr.c
index 4b67834,e05446d..717ff9a
mode 100755,100644..100644
@@@ -43,6 -43,9 +43,9 @@@ static GSList* g_engine_list = NULL
  static GSList* g_config_client_list = NULL;
  
  static tts_config_s* g_config_info = NULL;
+ extern char g_engine_id[128];
+ extern char g_setting[128];
+ extern char g_language[128];
  
  static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
  static int g_config_fd_noti;
@@@ -87,7 -90,7 +90,7 @@@ int __tts_config_mgr_check_engine_is_va
                        return -1;
                }
  
-               if (0 == strcmp(engine_id, engine_info->uuid)) {
+               if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
                        SLOG(LOG_DEBUG, tts_tag(), "Default engine is valid : %s", engine_id);
                        return 0;
                }
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
  
-       if (NULL != g_config_info->engine_id)   free(g_config_info->engine_id);
-       if (NULL != g_config_info->setting)     free(g_config_info->setting);
-       g_config_info->engine_id = strdup(engine_info->uuid);
-       g_config_info->setting = strdup(engine_info->setting);
+       if (NULL != engine_info->uuid) {
+               memset(g_engine_id, '\0', sizeof(g_engine_id));
+               g_config_info->engine_id = g_engine_id;
+               strncpy(g_config_info->engine_id, engine_info->uuid, sizeof(g_engine_id) - 1);
+       }
+       if (NULL != engine_info->setting) {
+               memset(g_setting, '\0', sizeof(g_setting));
+               g_config_info->setting = g_setting;
+               strncpy(g_config_info->setting, engine_info->setting, sizeof(g_setting) - 1);
+       }
  
        SLOG(LOG_DEBUG, tts_tag(), "Default engine is changed : %s", g_config_info->engine_id);
  
                voice = iter_voice->data;
  
                if (NULL != voice) {
-                       if (NULL != voice->language && NULL != g_config_info->language) {
+                       if (NULL != voice->language) {
                                if (0 == strcmp(voice->language, g_config_info->language)) {
                                        if (voice->type == g_config_info->type) {
                                                /* language is valid */
                                                is_valid_voice = true;
  
-                                               free(g_config_info->language);
-                                               g_config_info->language = strdup(voice->language);
+                                               memset(g_language, '\0', sizeof(g_language));
+                                               g_config_info->language = g_language;
+                                               strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
                                                g_config_info->type = voice->type;
  
                                                SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
  
        if (false == is_valid_voice) {
                /* Select first voice as default */
-               if (NULL != g_config_info->language) {
-                       free(g_config_info->language);
-                       iter_voice = g_slist_nth(engine_info->voices, 0);
-                       if (NULL == iter_voice) {
-                               SLOG(LOG_ERROR, tts_tag(), "Fail to get voice list");
-                               return TTS_CONFIG_ERROR_OPERATION_FAILED;
-                       }
-                       voice = iter_voice->data;
+               memset(g_language, '\0', sizeof(g_language));
+               g_config_info->language = g_language;
  
-                       if (NULL == voice || NULL == voice->language) {
-                               SLOG(LOG_ERROR, tts_tag(), "Fail to get voice info from list");
-                               return TTS_CONFIG_ERROR_OPERATION_FAILED;
-                       }
+               iter_voice = g_slist_nth(engine_info->voices, 0);
+               if (NULL == iter_voice) {
+                       SLOG(LOG_ERROR, tts_tag(), "Fail to get voice list");
+                       return TTS_CONFIG_ERROR_OPERATION_FAILED;
+               }
+               voice = iter_voice->data;
  
-                       g_config_info->language = strdup(voice->language);
-                       g_config_info->type = voice->type;
-                       SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
+               if (NULL == voice || NULL == voice->language) {
+                       SLOG(LOG_ERROR, tts_tag(), "Fail to get voice info from list");
+                       return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
+               strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
+               g_config_info->type = voice->type;
+               SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
        }
  
        if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting, 
@@@ -354,16 -363,14 +363,14 @@@ Eina_Bool tts_config_mgr_inotify_event_
                /* engine changed */
                if (NULL != engine || NULL != setting) {
                        if (NULL != engine) {
-                               if (NULL != g_config_info->engine_id)
-                                       free(g_config_info->engine_id);
-                               g_config_info->engine_id = strdup(engine);
+                               memset(g_engine_id, '\0', sizeof(g_engine_id));
+                               g_config_info->engine_id = g_engine_id;
+                               strncpy(g_config_info->engine_id, engine, sizeof(g_engine_id) - 1);
                        }
                        if (NULL != setting) {
-                               if (NULL != g_config_info->setting)
-                                       free(g_config_info->setting);
-                               g_config_info->setting = strdup(setting);
+                               memset(g_setting, '\0', sizeof(g_setting));
+                               g_config_info->setting = g_setting;
+                               strncpy(g_config_info->setting, setting, sizeof(g_setting) - 1);
                        }
  
                        SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine change(%s)", g_config_info->engine_id);
                        before_type = g_config_info->type;
  
                        if (NULL != lang) {
-                               if (NULL != g_config_info->language)
-                                       free(g_config_info->language);
-                               g_config_info->language = strdup(lang);
+                               memset(g_language, '\0', sizeof(g_language));
+                               g_config_info->language = g_language;
+                               strncpy(g_config_info->language, lang, sizeof(g_language) - 1);
                        }
                        if (-1 != voice_type) {
                                g_config_info->type = voice_type;
  
                        if (NULL != before_lang) {
                                free(before_lang);
+                               before_lang = NULL;
                        }
                }
  
                        }
                }
  
-               if (NULL != engine)     free(engine);
-               if (NULL != setting)    free(setting);
-               if (NULL != lang)       free(lang);
+               if (NULL != engine) {
+                       free(engine);
+                       engine = NULL;
+               }
+               if (NULL != setting) {
+                       free(setting);
+                       setting = NULL;
+               }
+               if (NULL != lang) {
+                       free(lang);
+                       lang = NULL;
+               }
        } else {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
        }
@@@ -547,6 -563,7 +563,7 @@@ int __tts_config_set_auto_language(
        char temp_lang[6] = {'\0', };
        strncpy(temp_lang, value, 5);
        free(value);
+       value = NULL;
  
        if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
                /* tts default voice change */
                before_lang = strdup(g_config_info->language);
                before_type = g_config_info->type;
  
-               free(g_config_info->language);
-               g_config_info->language = strdup(temp_lang);
+               memset(g_language, '\0', sizeof(g_language));
+               g_config_info->language = g_language;
+               strncpy(g_config_info->language, temp_lang, sizeof(g_language) - 1);
  
                SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)", 
                        g_config_info->language, g_config_info->type);
  
                if (NULL != before_lang) {
                        free(before_lang);
+                       before_lang = NULL;
                }
        } else {
                /* Display language is not valid */
                        iter = g_slist_next(iter);
                }
  
-               if (NULL != g_config_info->language) {
-                       free(g_config_info->language);
-                       g_config_info->language = strdup(tmp_language);
-               }
+               memset(g_language, '\0', sizeof(g_language));
+               g_config_info->language = g_language;
+               strncpy(g_config_info->language, tmp_language, sizeof(g_language) - 1);
  
                g_config_info->type = tmp_type;
  
                free(tmp_language);
+               tmp_language = NULL;
        }
  
        return 0;
@@@ -746,6 -766,8 +766,6 @@@ void __tts_config_release_engine(
  int __tts_config_mgr_get_engine_info()
  {
        DIR *dp = NULL;
 -      int ret = -1;
 -      struct dirent entry;
        struct dirent *dirp = NULL;
  
        char filepath[512] = {'\0',};
                SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
        } else {
                do {
 -                      ret = readdir_r(dp, &entry, &dirp);
 -                      if (0 != ret) {
 -                              SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
 -                              break;
 -                      }
 +                      dirp = readdir(dp);
  
                        if (NULL != dirp) {
                                if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
                SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
        } else {
                do {
 -                      ret = readdir_r(dp, &entry, &dirp);
 -                      if (0 != ret) {
 -                              SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
 -                              break;
 -                      }
 +                      dirp = readdir(dp);
  
                        if (NULL != dirp) {
                                if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
@@@ -879,7 -909,10 +899,10 @@@ static Eina_Bool __tts_config_mgr_engin
                        } else {
                                SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
                        }
-                       if (NULL != temp_lang)  free(temp_lang);
+                       if (NULL != temp_lang) {
+                               free(temp_lang);
+                               temp_lang = NULL;
+                       }
                }
  
                GSList *iter = NULL;
@@@ -981,6 -1014,7 +1004,7 @@@ static int __tts_config_mgr_unregister_
                                close(tmp->dir_fd);
  
                                free(tmp);
+                               tmp = NULL;
                        }
  
                        g_ino_list = g_list_remove_link(g_ino_list, iter);
@@@ -1118,14 -1152,14 +1142,14 @@@ int tts_config_mgr_initialize(int uid
                        }
  
                        if (NULL != tmp_language) {
-                               if (NULL != g_config_info->language) {
-                                       free(g_config_info->language);
-                                       g_config_info->language = strdup(tmp_language);
-                               }
+                               memset(g_language, '\0', sizeof(g_language));
+                               g_config_info->language = g_language;
+                               strncpy(g_config_info->language, tmp_language, sizeof(g_language) - 1);
  
                                g_config_info->type = tmp_type;
  
                                free(tmp_language);
+                               tmp_language = NULL;
  
                                if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
                                        SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
@@@ -1448,10 -1482,8 +1472,8 @@@ int tts_config_mgr_set_engine(const cha
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
  
        /* Check current engine id with new engine id */
-       if (NULL != g_config_info->engine_id) {
-               if (0 == strcmp(g_config_info->engine_id, engine))
-                       return 0;
-       }
+       if (0 == strcmp(g_config_info->engine_id, engine))
+               return 0;
  
        if (0 >= g_slist_length(g_engine_list)) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
                        continue;
                }
  
-               if (NULL != g_config_info->engine_id)
-                       free(g_config_info->engine_id);
-               g_config_info->engine_id = strdup(engine);
+               memset(g_engine_id, '\0', sizeof(g_engine_id));
+               g_config_info->engine_id = g_engine_id;
+               strncpy(g_config_info->engine_id, engine, sizeof(g_engine_id) - 1);
  
                if (NULL != engine_info->setting) {
-                       if (NULL != g_config_info->setting) {
-                               free(g_config_info->setting);
-                               g_config_info->setting = NULL;
-                       }
-                       g_config_info->setting = strdup(engine_info->setting);
+                       memset(g_setting, '\0', sizeof(g_setting));
+                       g_config_info->setting = g_setting;
+                       strncpy(g_config_info->setting, engine_info->setting, sizeof(g_setting) - 1);
                }
  
                /* Engine is valid*/
                }
  
                if (false == is_valid_voice) {
-                       if (NULL != g_config_info->language) {
-                               free(g_config_info->language);
-                               iter_voice = g_slist_nth(engine_info->voices, 0);
-                               if (NULL != iter_voice) {
-                                       voice = iter_voice->data;
-                                       if (NULL != voice) {
-                                               if (NULL != voice->language)
-                                                       g_config_info->language = strdup(voice->language);
-                                               g_config_info->type = voice->type;
-                                       }
+                       memset(g_language, '\0', sizeof(g_language));
+                       g_config_info->language = g_language;
+                       iter_voice = g_slist_nth(engine_info->voices, 0);
+                       if (NULL != iter_voice) {
+                               voice = iter_voice->data;
+                               if (NULL != voice) {
+                                       if (NULL != voice->language)
+                                               strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
+                                       g_config_info->type = voice->type;
                                }
                        }
                }
@@@ -1643,7 -1672,7 +1662,7 @@@ int tts_config_mgr_get_voice(char** lan
        if (NULL == language || NULL == type)
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
  
-       if (NULL != g_config_info->language) {
+       if (0 != strlen(g_config_info->language)) {
                *language = strdup(g_config_info->language);
                *type = g_config_info->type;
        } else {
@@@ -1672,19 -1701,15 +1691,15 @@@ int tts_config_mgr_set_voice(const char
        }
  
        /* Check language is valid */
-       if (NULL != g_config_info->language) {
-               if (0 != tts_parser_set_voice(language, type)) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
-                       return TTS_CONFIG_ERROR_OPERATION_FAILED;
-               }
-               free(g_config_info->language);
-               g_config_info->language = strdup(language);
-               g_config_info->type = type;
-       } else {
-               SLOG(LOG_ERROR, tts_tag(), "language is NULL");
+       if (0 != tts_parser_set_voice(language, type)) {
+               SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
+       memset(g_language, '\0', sizeof(g_language));
+       g_config_info->language = g_language;
+       strncpy(g_config_info->language, language, sizeof(g_language) - 1);
+       g_config_info->type = type;
  
        return 0;
  }
@@@ -1903,7 -1928,7 +1918,7 @@@ bool tts_config_check_default_voice_is_
        if (NULL == language)
                return false;
  
-       if (NULL == g_config_info->engine_id) {
+       if (0 == strlen(g_config_info->engine_id)) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Default engine id is NULL");
                return false;
        }
diff --combined server/ttsd_dbus.c
index 5342bd3,4b2ab38..4b2ab38
mode 100644,100755..100644
@@@ -315,6 -315,7 +315,7 @@@ void __ttsd_dbus_connection_free(
  
  int ttsd_dbus_open_connection()
  {
+       SLOG(LOG_DEBUG, tts_tag(), "=== start dbus open connection");
        DBusError err;
        dbus_error_init(&err);
  
                g_service_object = (char*)calloc(strlen(TTS_SR_SERVER_SERVICE_OBJECT_PATH) + 1, sizeof(char));
                g_service_interface = (char*)calloc(strlen(TTS_SR_SERVER_SERVICE_INTERFACE) + 1, sizeof(char));
  
+               if (NULL == g_service_name || NULL == g_service_object || NULL == g_service_interface) {
+                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+                       __ttsd_dbus_service_free();
+                       __ttsd_dbus_connection_free();
+                       return -1;
+               }
                snprintf(g_service_name, strlen(TTS_SR_SERVER_SERVICE_NAME) + 1, "%s", TTS_SR_SERVER_SERVICE_NAME);
                snprintf(g_service_object, strlen(TTS_SR_SERVER_SERVICE_OBJECT_PATH) + 1, "%s", TTS_SR_SERVER_SERVICE_OBJECT_PATH);
                snprintf(g_service_interface, strlen(TTS_SR_SERVER_SERVICE_INTERFACE) + 1, "%s", TTS_SR_SERVER_SERVICE_INTERFACE);
                g_service_object = (char*)calloc(strlen(TTS_NOTI_SERVER_SERVICE_OBJECT_PATH) + 1, sizeof(char));
                g_service_interface = (char*)calloc(strlen(TTS_NOTI_SERVER_SERVICE_INTERFACE) + 1, sizeof(char));
  
+               if (NULL == g_service_name || NULL == g_service_object || NULL == g_service_interface) {
+                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+                       __ttsd_dbus_service_free();
+                       __ttsd_dbus_connection_free();
+                       return -1;
+               }
                snprintf(g_service_name, strlen(TTS_NOTI_SERVER_SERVICE_NAME) + 1, "%s", TTS_NOTI_SERVER_SERVICE_NAME);
                snprintf(g_service_object, strlen(TTS_NOTI_SERVER_SERVICE_OBJECT_PATH) + 1, "%s", TTS_NOTI_SERVER_SERVICE_OBJECT_PATH);
                snprintf(g_service_interface, strlen(TTS_NOTI_SERVER_SERVICE_INTERFACE) + 1, "%s", TTS_NOTI_SERVER_SERVICE_INTERFACE);
                g_service_object = (char*)calloc(strlen(TTS_SERVER_SERVICE_OBJECT_PATH) + 1, sizeof(char));
                g_service_interface = (char*)calloc(strlen(TTS_SERVER_SERVICE_INTERFACE) + 1, sizeof(char));
  
+               if (NULL == g_service_name || NULL == g_service_object || NULL == g_service_interface) {
+                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+                       __ttsd_dbus_service_free();
+                       __ttsd_dbus_connection_free();
+                       return -1;
+               }
                snprintf(g_service_name, strlen(TTS_SERVER_SERVICE_NAME) + 1, "%s", TTS_SERVER_SERVICE_NAME);
                snprintf(g_service_object, strlen(TTS_SERVER_SERVICE_OBJECT_PATH) + 1, "%s", TTS_SERVER_SERVICE_OBJECT_PATH);
                snprintf(g_service_interface, strlen(TTS_SERVER_SERVICE_INTERFACE) + 1, "%s", TTS_SERVER_SERVICE_INTERFACE);
        }
  
-       if (NULL == g_service_name || NULL == g_service_object || NULL == g_service_interface) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
-               __ttsd_dbus_service_free();
-               __ttsd_dbus_connection_free();
-               return -1;
-       }
        /* request our name on the bus and check for errors */
        ret = dbus_bus_request_name(g_conn_listener, g_service_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
        if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
                return -1;
        }
  
+       SLOG(LOG_DEBUG, tts_tag(), "===");
        return 0;
  }
  
  int ttsd_dbus_close_connection()
  {
+       SLOG(LOG_DEBUG, tts_tag(), "=== start dbus close connection");
        DBusError err;
        dbus_error_init(&err);
  
        __ttsd_dbus_connection_free();
        __ttsd_dbus_service_free();
  
+       SLOG(LOG_DEBUG, tts_tag(), "===");
        return 0;
  }
diff --combined server/ttsd_server.c
index d87437f,1e016e5..8820904
mode 100755,100644..100644
@@@ -373,7 -373,10 +373,10 @@@ void __config_changed_cb(tts_config_typ
                        /* Current language is not available */
                        SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Fail to set voice : lang(%s), type(%d)", str_param, int_param);
                }
-               if (NULL != out_lang)   free(out_lang);
+               if (NULL != out_lang) {
+                       free(out_lang);
+                       out_lang = NULL;
+               }
                break;
        }
  
@@@ -554,7 -557,9 +557,7 @@@ static Eina_Bool __quit_ecore_loop(voi
  static void __read_proc()
  {
        DIR *dp = NULL;
 -      struct dirent entry;
        struct dirent *dirp = NULL;
 -      int ret = -1;
        int tmp;
  
        GList *iter = NULL;
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to open proc");
        } else {
                do {
 -                      ret = readdir_r(dp, &entry, &dirp);
 -                      if (0 != ret) {
 -                              SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to readdir");
 -                              break;
 -                      }
 +                      dirp = readdir(dp);
  
                        if (NULL != dirp) {
                                tmp = atoi(dirp->d_name);
@@@ -703,7 -712,10 +706,10 @@@ int ttsd_server_add_queue(int uid, cons
        int temp_type;
        if (true != ttsd_engine_select_valid_voice((const char*)lang, voice_type, &temp_lang, &temp_type)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to select valid voice");
-               if (NULL != temp_lang)  free(temp_lang);
+               if (NULL != temp_lang) {
+                       free(temp_lang);
+                       temp_lang = NULL;
+               }
                return TTSD_ERROR_INVALID_VOICE;
        }
  
        speak_data = (speak_data_s*)calloc(1, sizeof(speak_data_s));
        if (NULL == speak_data) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to allocate memory");
-               if (NULL != temp_lang)  free(temp_lang);
+               if (NULL != temp_lang) {
+                       free(temp_lang);
+                       temp_lang = NULL;
+               }
                return TTSD_ERROR_OPERATION_FAILED;
        }
  
        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*/
-       if (0 != ttsd_data_add_speak_data(uid, speak_data)) {
+       int ret = -1;
+       ret = ttsd_data_add_speak_data(uid, speak_data);
+       if (0 != ret) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add speak data");
-               if (NULL != temp_lang)  free(temp_lang);
+               if (NULL != temp_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 = NULL;
                }
  
-               return TTSD_ERROR_OPERATION_FAILED;
+               return ret;
        }
  
        if (0 != ttsd_data_set_used_voice(uid, temp_lang, temp_type)) {
                }
        }
  
-       if (NULL != temp_lang)  free(temp_lang);
+       if (NULL != temp_lang) {
+               free(temp_lang);
+               temp_lang = NULL;
+       }
  
        if (APP_STATE_PLAYING == state) {
                /* check if engine use network */