From 058698c9cf07234857c0068ec483f09cc8e107fa Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=B6ran=20J=C3=B6nsson?= Date: Fri, 28 Nov 2014 12:45:14 +0100 Subject: [PATCH] rtsp: Ref transports in hash table. Also ref streams for transports. This solves a crash when reciving a rtcp after teardown but before client finalize. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=740845 --- gst/rtsp-server/rtsp-client.c | 6 +++++- gst/rtsp-server/rtsp-stream-transport.c | 4 ++++ gst/rtsp-server/rtsp-stream.c | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index f97a642..3885ee9 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -284,7 +284,9 @@ gst_rtsp_client_init (GstRTSPClient * client) g_mutex_init (&priv->watch_lock); priv->close_seq = 0; priv->drop_backlog = DEFAULT_DROP_BACKLOG; - priv->transports = g_hash_table_new (g_direct_hash, g_direct_equal); + priv->transports = + g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, + g_object_unref); } static GstRTSPFilterResult @@ -1861,8 +1863,10 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx) g_hash_table_insert (priv->transports, GINT_TO_POINTER (ct->interleaved.min), trans); + g_object_ref (trans); g_hash_table_insert (priv->transports, GINT_TO_POINTER (ct->interleaved.max), trans); + g_object_ref (trans); } /* create and serialize the server transport */ diff --git a/gst/rtsp-server/rtsp-stream-transport.c b/gst/rtsp-server/rtsp-stream-transport.c index c69de26..0498830 100644 --- a/gst/rtsp-server/rtsp-stream-transport.c +++ b/gst/rtsp-server/rtsp-stream-transport.c @@ -118,6 +118,9 @@ gst_rtsp_stream_transport_finalize (GObject * obj) gst_rtsp_stream_transport_set_callbacks (trans, NULL, NULL, NULL, NULL); gst_rtsp_stream_transport_set_keepalive (trans, NULL, NULL, NULL); + if (priv->stream) + g_object_unref (priv->stream); + if (priv->transport) gst_rtsp_transport_free (priv->transport); @@ -149,6 +152,7 @@ gst_rtsp_stream_transport_new (GstRTSPStream * stream, GstRTSPTransport * tr) trans = g_object_new (GST_TYPE_RTSP_STREAM_TRANSPORT, NULL); priv = trans->priv; priv->stream = stream; + priv->stream = g_object_ref (priv->stream); priv->transport = tr; return trans; diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index 2d237d1..f2ac3db 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -2249,8 +2249,11 @@ gst_rtsp_stream_recv_rtcp (GstRTSPStream * stream, GstBuffer * buffer) g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), GST_FLOW_ERROR); priv = stream->priv; g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); - g_return_val_if_fail (priv->is_joined, FALSE); + if (!priv->is_joined) { + gst_buffer_unref (buffer); + return GST_FLOW_NOT_LINKED; + } g_mutex_lock (&priv->lock); if (priv->appsrc[1]) element = gst_object_ref (priv->appsrc[1]); -- 2.7.4