Fix to avoid crash in paused_data 15/227815/1
authorsooyeon.kim <sooyeon.kim@samsung.com>
Mon, 16 Mar 2020 05:20:41 +0000 (14:20 +0900)
committersooyeon.kim <sooyeon.kim@samsung.com>
Mon, 16 Mar 2020 11:12:02 +0000 (20:12 +0900)
Signed-off-by: sooyeon.kim <sooyeon.kim@samsung.com>
Conflicts:
server/ttsd_player.c

Change-Id: I30f22a1784ca2f93225b4ff0efb59a2f2229c076

server/ttsd_player.c

index 3ddd8bc..5ae0f1d 100644 (file)
@@ -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(&current->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;