From b2abb970435e618e8475c7d8060142cec4673dbe Mon Sep 17 00:00:00 2001 From: Sebastian Rasmussen Date: Tue, 22 Dec 2015 12:08:02 +0100 Subject: [PATCH] rtsp-media: Do not prepare media after media times out Deferred calls to start_prepare() can be deferred past the point until which wait_preroll() and by proxy gst_rtsp_media_get_status() is prepared to wait. Previously there was no lock and no check for this situation. This meant that a media could be prepared and unprepared simultaneously by two different threads. Now a lock is in place and a suitable check is done. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=759773 --- gst/rtsp-server/rtsp-media.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 61e68b2..951c5ac 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -2555,6 +2555,10 @@ start_prepare (GstRTSPMedia * media) guint i; GList *walk; + g_rec_mutex_lock (&priv->state_lock); + if (priv->status != GST_RTSP_MEDIA_STATUS_PREPARING) + goto no_longer_preparing; + /* link streams we already have, other streams might appear when we have * dynamic elements */ for (i = 0; i < priv->streams->len; i++) { @@ -2603,18 +2607,28 @@ start_prepare (GstRTSPMedia * media) if (!start_preroll (media)) goto preroll_failed; + g_rec_mutex_unlock (&priv->state_lock); + return FALSE; +no_longer_preparing: + { + GST_INFO ("media is no longer preparing"); + g_rec_mutex_unlock (&priv->state_lock); + return FALSE; + } join_bin_failed: { GST_WARNING ("failed to join bin element"); gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR); + g_rec_mutex_unlock (&priv->state_lock); return FALSE; } preroll_failed: { GST_WARNING ("failed to preroll pipeline"); gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR); + g_rec_mutex_unlock (&priv->state_lock); return FALSE; } } -- 2.7.4