From 2edab1d0dc860948b8cf982df6a9c1827b5d3eae Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Mon, 16 Mar 2020 14:20:41 +0900 Subject: [PATCH] Fix to avoid crash in paused_data Signed-off-by: sooyeon.kim Conflicts: server/ttsd_player.c Change-Id: I30f22a1784ca2f93225b4ff0efb59a2f2229c076 --- server/ttsd_player.c | 62 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/server/ttsd_player.c b/server/ttsd_player.c index 3ddd8bc..5ae0f1d 100644 --- a/server/ttsd_player.c +++ b/server/ttsd_player.c @@ -539,8 +539,35 @@ static void __play_thread(void *data, Ecore_Thread *thread) while (1) { if (true == player->is_paused_data) { /* Resume player */ - sound_data = player->paused_data; - player->paused_data = NULL; + if (NULL != sound_data) { + ttsd_data_clear_sound_data(&sound_data); + } + sound_data = (sound_data_s*)calloc(1, sizeof(sound_data_s)); + char* temp = (char*)calloc(player->paused_data->data_size + 5, sizeof(char)); + if (NULL == sound_data || NULL == temp || player->paused_data->data_size <= 0) { + SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Out of memory OR paused_data is empty"); + ttsd_data_clear_sound_data(&sound_data); + if (NULL != temp) { + free(temp); + temp = NULL; + } + sound_data = player->paused_data; + player->paused_data = NULL; + } else { + SLOG(LOG_INFO, tts_tag(), "[Player INFO] Copy paused_data to sound_data"); + sound_data->data = NULL; + sound_data->rate = 0; + sound_data->data_size = 0; + sound_data->utt_id = player->paused_data->utt_id; + sound_data->event = player->paused_data->event; + sound_data->audio_type = player->paused_data->audio_type; + sound_data->rate = player->paused_data->rate; + + sound_data->data = temp; + memcpy(sound_data->data, player->paused_data->data, player->paused_data->data_size); + sound_data->data_size = player->paused_data->data_size; + ttsd_data_clear_sound_data(&player->paused_data); + } idx = player->idx; @@ -765,6 +792,8 @@ static void __play_thread(void *data, Ecore_Thread *thread) if (APP_STATE_PAUSED == player->state) { /* Save data */ SLOG(LOG_DEBUG, tts_tag(), "[Player] player(%p)", player); + ttsd_data_clear_sound_data(&player->paused_data); + player->paused_data = sound_data; player->is_paused_data = true; @@ -975,7 +1004,7 @@ int __destroy_ducking_handle(void) ret = sound_manager_destroy_stream_ducking(g_notification_stream_ducking); if (SOUND_MANAGER_ERROR_NONE != ret) SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy notification stream ducking, ret(%d)", ret); - g_notification_stream_ducking = NULL; + g_notification_stream_ducking = NULL; } else { SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for notification stream is already created"); } @@ -1078,7 +1107,7 @@ int ttsd_player_create_instance(int uid) new_client->is_paused_data = false; new_client->idx = 0; new_client->paused_data = NULL; - + SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Player] Create player : uid(%d)", uid); g_player_list = g_list_append(g_player_list, new_client); @@ -1122,7 +1151,8 @@ int ttsd_player_destroy_instance(int uid) if (uid == data->uid) { g_player_list = g_list_remove_link(g_player_list, iter); free(data); - g_list_free(iter); + data = NULL; + g_list_free(iter); break; } } @@ -1248,15 +1278,8 @@ int ttsd_player_clear(int uid) } if (true == current->is_paused_data) { - if (NULL != current->paused_data) { - if (NULL != current->paused_data->data) { - free(current->paused_data->data); - current->paused_data->data = NULL; - } - - free(current->paused_data); - current->paused_data = NULL; - } + SLOG(LOG_INFO, tts_tag(), "[Player INFO] Clear paused data"); + ttsd_data_clear_sound_data(¤t->paused_data); } current->event = TTSE_RESULT_EVENT_FINISH; @@ -1397,15 +1420,8 @@ int ttsd_player_all_stop() data->state = APP_STATE_READY; if (true == data->is_paused_data) { - if (NULL != data->paused_data) { - if (NULL != data->paused_data->data) { - free(data->paused_data->data); - data->paused_data->data = NULL; - } - - free(data->paused_data); - data->paused_data = NULL; - } + SLOG(LOG_INFO, tts_tag(), "[Player INFO] Clear paused data"); + ttsd_data_clear_sound_data(&data->paused_data); } data->is_paused_data = false; -- 2.7.4