decodebin3: fix dead lock when removing pad
authorGuillaume Desmottes <guillaume.desmottes@onestream.live>
Wed, 21 Dec 2022 09:44:40 +0000 (10:44 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 11 Jan 2023 15:06:37 +0000 (15:06 +0000)
gst_element_remove_pad() is triggering a call to
gst_decodebin3_input_pad_unlink() which needs the input lock as well,
resulting in a dead lock.

Fix #1667

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3614>

subprojects/gst-plugins-base/gst/playback/gstdecodebin3.c

index 97a476b..7d733d3 100644 (file)
@@ -711,6 +711,7 @@ gst_decodebin3_dispose (GObject * object)
 
   gst_clear_object (&dbin->collection);
 
+  INPUT_LOCK (dbin);
   if (dbin->main_input) {
     free_input (dbin, dbin->main_input);
     dbin->main_input = NULL;
@@ -724,6 +725,7 @@ gst_decodebin3_dispose (GObject * object)
     free_input (dbin, input);
     dbin->other_inputs = g_list_delete_link (dbin->other_inputs, walk);
   }
+  INPUT_UNLOCK (dbin);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -1170,7 +1172,10 @@ free_input (GstDecodebin3 * dbin, DecodebinInput * input)
 
   GST_LOG_OBJECT (dbin, "Freeing input %p", input);
 
+  INPUT_UNLOCK (dbin);
   gst_element_remove_pad (GST_ELEMENT (dbin), input->ghost_sink);
+  INPUT_LOCK (dbin);
+
   g_free (input);
 }