sdpdemux: ensure that only one srcpad is created per stream
authorMichael Olbrich <m.olbrich@pengutronix.de>
Thu, 11 May 2023 13:28:35 +0000 (15:28 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 16 Jun 2023 01:53:12 +0000 (01:53 +0000)
If two senders use the same multicast IP and port then new_session_pad()
may try to add a srcpad to the same stream twice.

stream->srcpad is updated but gst_element_add_pad() fails the second
time. As a result stream->srcpad points to a deleted object and
access in gst_sdp_demux_stream_free() fails with a segfault.

Just ignore the second pad. Nothing useful can be done with it anyway.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4873>

subprojects/gst-plugins-bad/gst/sdp/gstsdpdemux.c

index a97dd54..cc5baa6 100644 (file)
@@ -536,6 +536,9 @@ new_session_pad (GstElement * session, GstPad * pad, GstSDPDemux * demux)
   if (stream == NULL)
     goto unknown_stream;
 
+  if (stream->srcpad)
+    goto unexpected_pad;
+
   stream->ssrc = ssrc;
 
   /* no need for a timeout anymore now */
@@ -576,6 +579,13 @@ new_session_pad (GstElement * session, GstPad * pad, GstSDPDemux * demux)
   return;
 
   /* ERRORS */
+unexpected_pad:
+  {
+    GST_DEBUG_OBJECT (demux, "ignoring unexpected session pad");
+    GST_SDP_STREAM_UNLOCK (demux);
+    g_free (name);
+    return;
+  }
 unknown_stream:
   {
     GST_DEBUG_OBJECT (demux, "ignoring unknown stream");