adaptivedemux2: Fix a small race on shutdown
authorJan Schmidt <jan@centricular.com>
Thu, 4 Aug 2022 13:54:27 +0000 (23:54 +1000)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 5 Aug 2022 22:36:49 +0000 (23:36 +0100)
Make sure gst_adaptive_demux_loop_cancel_call()
never tries to operate on an invalidated main context. Make
sure to clear the main context pointer while holding the lock,
and to check it in gst_adaptive_demux_loop_cancel_call()

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

subprojects/gst-plugins-good/ext/adaptivedemux2/gstadaptivedemuxutils.c

index 994a94b..de0a7e2 100644 (file)
@@ -215,11 +215,12 @@ _gst_adaptive_demux_loop_thread (GstAdaptiveDemuxLoop * loop)
   loop->loop = NULL;
 
   g_cond_broadcast (&loop->cond);
-  g_mutex_unlock (&loop->lock);
 
   g_main_context_unref (loop->context);
   loop->context = NULL;
 
+  g_mutex_unlock (&loop->lock);
+
   gst_adaptive_demux_loop_unref (loop);
 
   return NULL;
@@ -380,12 +381,13 @@ gst_adaptive_demux_loop_call_delayed (GstAdaptiveDemuxLoop * loop,
 void
 gst_adaptive_demux_loop_cancel_call (GstAdaptiveDemuxLoop * loop, guint cb_id)
 {
-  GSource *s;
 
   g_mutex_lock (&loop->lock);
-  s = g_main_context_find_source_by_id (loop->context, cb_id);
-  if (s)
-    g_source_destroy (s);
+  if (loop->context) {
+    GSource *s = g_main_context_find_source_by_id (loop->context, cb_id);
+    if (s)
+      g_source_destroy (s);
+  }
   g_mutex_unlock (&loop->lock);
 }