rtsp-media: Fix race codition in finish_unprepare
authorLars Wiréen <larswi@axis.com>
Thu, 27 Dec 2018 10:28:17 +0000 (11:28 +0100)
committerSebastian Dröge <slomo@coaxion.net>
Fri, 25 Jan 2019 12:44:23 +0000 (12:44 +0000)
The previous fix for race condition around finish_unprepare where the
function could be called twice assumed that the status wouldn't change
during execution of the function. This assumption is incorrect as the
state may change, for example if an error message arrives from the
pipeline bus.

Instead a flag keeping track on whether the finish_unprepare function
is currently executing is introduced and checked.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/issues/59

gst/rtsp-server/rtsp-media.c

index 490c73d..e95b0de 100644 (file)
@@ -115,6 +115,7 @@ struct _GstRTSPMediaPrivate
   gint prepare_count;
   gint n_active;
   gboolean complete;
+  gboolean finishing_unprepare;
 
   /* the pipeline for the media */
   GstElement *pipeline;
@@ -3618,6 +3619,10 @@ finish_unprepare (GstRTSPMedia * media)
   gint i;
   GList *walk;
 
+  if (priv->finishing_unprepare)
+    return;
+  priv->finishing_unprepare = TRUE;
+
   GST_DEBUG ("shutting down");
 
   /* release the lock on shutdown, otherwise pad_added_cb might try to
@@ -3628,9 +3633,6 @@ finish_unprepare (GstRTSPMedia * media)
 
   media_streams_set_blocked (media, FALSE);
 
-  if (priv->status != GST_RTSP_MEDIA_STATUS_UNPREPARING)
-    return;
-
   for (i = 0; i < priv->streams->len; i++) {
     GstRTSPStream *stream;
 
@@ -3683,6 +3685,8 @@ finish_unprepare (GstRTSPMedia * media)
     GST_DEBUG ("stop thread");
     gst_rtsp_thread_stop (priv->thread);
   }
+
+  priv->finishing_unprepare = FALSE;
 }
 
 /* called with state-lock */