From 3f498e0461a7af3925c536d9c845c3f6190a9adf Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 28 Oct 2022 13:45:54 +0900 Subject: [PATCH] [0.6.255] fix crash when player destroy during prepare_async - The removed element is accessed in the __mmplayer_release_signal_connection() function cherry-pick : fd6c5d52629a4edd19d4a0aa0ec697873ede148d Change-Id: I43d83f402a47c0224f8196926ab7b4abc7bccefb --- packaging/libmm-player.spec | 2 +- src/mm_player_gst.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 9e5fbe0..68462ca 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -1,6 +1,6 @@ Name: libmm-player Summary: Multimedia Framework Player Library -Version: 0.6.254 +Version: 0.6.255 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 9111fac..ae27ae2 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -3186,11 +3186,46 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el return; } +static void +__mmplayer_delete_signal_connection(mmplayer_t *player, GstElement *removed_element) +{ + MMPLAYER_FENTER(); + + MMPLAYER_RETURN_IF_FAIL(player); + MMPLAYER_RETURN_IF_FAIL(removed_element); + + LOGD("delete signal on %s", GST_ELEMENT_NAME(removed_element)); + + for (int type = MM_PLAYER_SIGNAL_TYPE_AUTOPLUG; type < MM_PLAYER_SIGNAL_TYPE_ALL; type++) { + GList *node = player->signals[type]; + while (node) { + GList *next_node = node->next; + mmplayer_signal_item_t *item = node->data; + if (item && item->obj == G_OBJECT(removed_element)) { + player->signals[type] = g_list_delete_link(player->signals[type], node); + MMPLAYER_FREEIF(item); + } + node = next_node; + } + } + + MMPLAYER_FLEAVE(); +} + void __mmplayer_gst_deep_element_removed(GstElement *bin, GstBin *child, GstElement *element, gpointer data) { + mmplayer_t *player = (mmplayer_t *)data; + + MMPLAYER_FENTER(); + + MMPLAYER_RETURN_IF_FAIL(player); + LOGD("%s > %s > %s", GST_ELEMENT_NAME(bin), GST_ELEMENT_NAME(child), GST_ELEMENT_NAME(element)); - return; + + __mmplayer_delete_signal_connection(player, element); + + MMPLAYER_FLEAVE(); } static GstElement * -- 2.7.4