rtsp: Ref transports in hash table.
authorGöran Jönsson <goranjn@axis.com>
Fri, 28 Nov 2014 11:45:14 +0000 (12:45 +0100)
committerWim Taymans <wtaymans@redhat.com>
Tue, 2 Dec 2014 15:29:24 +0000 (16:29 +0100)
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
gst/rtsp-server/rtsp-stream-transport.c
gst/rtsp-server/rtsp-stream.c

index f97a642..3885ee9 100644 (file)
@@ -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 */
index c69de26..0498830 100644 (file)
@@ -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;
index 2d237d1..f2ac3db 100644 (file)
@@ -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]);