From cd17c71dcea5c9310d21f1347c7520983e5869ac Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 29 Jun 2017 18:59:58 +0300 Subject: [PATCH] rtspsrc: Create send/recv mutexes once, not on every connect() Also fixes a crash caused by freeing an uninitialized mutex in an error case. https://bugzilla.gnome.org//show_bug.cgi?id=784282 --- gst/rtsp/gstrtspsrc.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index 88e8691..ddf9005 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -913,6 +913,9 @@ gst_rtspsrc_init (GstRTSPSrc * src) src->state = GST_RTSP_STATE_INVALID; + g_mutex_init (&src->conninfo.send_lock); + g_mutex_init (&src->conninfo.recv_lock); + GST_OBJECT_FLAG_SET (src, GST_ELEMENT_FLAG_SOURCE); gst_bin_set_suppressed_flags (GST_BIN (src), GST_ELEMENT_FLAG_SOURCE | GST_ELEMENT_FLAG_SINK); @@ -954,6 +957,9 @@ gst_rtspsrc_finalize (GObject * object) g_rec_mutex_clear (&rtspsrc->stream_rec_lock); g_rec_mutex_clear (&rtspsrc->state_rec_lock); + g_mutex_clear (&rtspsrc->conninfo.send_lock); + g_mutex_clear (&rtspsrc->conninfo.recv_lock); + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -1667,6 +1673,8 @@ gst_rtspsrc_create_stream (GstRTSPSrc * src, GstSDPMessage * sdp, gint idx, stream->ptmap = g_array_new (FALSE, FALSE, sizeof (PtMapItem)); stream->mikey = NULL; stream->stream_id = NULL; + g_mutex_init (&stream->conninfo.send_lock); + g_mutex_init (&stream->conninfo.recv_lock); g_array_set_clear_func (stream->ptmap, (GDestroyNotify) clear_ptmap_item); /* collect bandwidth information for this steam. FIXME, configure in the RTP @@ -1790,6 +1798,10 @@ gst_rtspsrc_stream_free (GstRTSPSrc * src, GstRTSPStream * stream) g_object_unref (stream->session); if (stream->rtx_pt_map) gst_structure_free (stream->rtx_pt_map); + + g_mutex_clear (&stream->conninfo.send_lock); + g_mutex_clear (&stream->conninfo.recv_lock); + g_free (stream); } @@ -4221,9 +4233,6 @@ gst_rtsp_conninfo_connect (GstRTSPSrc * src, GstRTSPConnInfo * info, } } while (!info->connected && retry); - g_mutex_init (&info->send_lock); - g_mutex_init (&info->recv_lock); - gst_rtsp_message_unset (&response); return GST_RTSP_OK; @@ -4268,9 +4277,6 @@ gst_rtsp_conninfo_close (GstRTSPSrc * src, GstRTSPConnInfo * info, gst_rtsp_connection_free (info->connection); info->connection = NULL; info->flushing = FALSE; - - g_mutex_clear (&info->send_lock); - g_mutex_clear (&info->recv_lock); } GST_RTSP_STATE_UNLOCK (src); return GST_RTSP_OK; -- 2.7.4