From ae32203cb09df5c877a8bc68179dbf165715ec52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Wir=C3=A9en?= Date: Thu, 27 Dec 2018 11:28:17 +0100 Subject: [PATCH] rtsp-media: Fix race codition in finish_unprepare 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 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 490c73da73..e95b0dede8 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -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 */