rtpbuffer: check for valid payload type
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 13 Sep 2013 14:01:42 +0000 (16:01 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 13 Sep 2013 14:05:58 +0000 (16:05 +0200)
The payload type can't be between 72 and 76 because with the marker bit set,
this could be mistaken for an RTCP packet then. We do a relaxed check and
only refuse 72-76 when the marker bit is set. The effect is that when
we try to map an RTCP packet as an RTP packet, we will certainly fail.

gst-libs/gst/rtp/gstrtpbuffer.c

index ebc0824..7c32d35 100644 (file)
@@ -316,7 +316,7 @@ gst_rtp_buffer_map (GstBuffer * buffer, GstMapFlags flags, GstRTPBuffer * rtp)
   guint8 padding;
   guint8 csrc_count;
   guint header_len;
-  guint8 version;
+  guint8 version, pt;
   guint8 *data;
   guint size;
   gsize bufsize, skip;
@@ -346,6 +346,13 @@ gst_rtp_buffer_map (GstBuffer * buffer, GstMapFlags flags, GstRTPBuffer * rtp)
   if (G_UNLIKELY (version != (GST_RTP_VERSION << 6)))
     goto wrong_version;
 
+  /* check reserved PT and marker bit, this is to check for RTCP
+   * packets. We do a relaxed check, you can still use 72-76 as long
+   * as the marker bit is cleared. */
+  pt = data[1];
+  if (G_UNLIKELY (pt >= 200 && pt <= 204))
+    goto reserved_pt;
+
   /* calc header length with csrc */
   csrc_count = (data[0] & 0x0f);
   header_len += csrc_count * sizeof (guint32);
@@ -442,6 +449,11 @@ wrong_version:
     GST_DEBUG ("version check failed (%d != %d)", version, GST_RTP_VERSION);
     goto dump_packet;
   }
+reserved_pt:
+  {
+    GST_DEBUG ("reserved PT %d found", pt);
+    goto dump_packet;
+  }
 wrong_padding:
   {
     GST_DEBUG ("padding check failed (%" G_GSIZE_FORMAT " - %d < %d)", bufsize,