rtpgstdepay: avoid buffer overread.
authorWim Taymans <wtaymans@redhat.com>
Thu, 20 Nov 2014 11:40:28 +0000 (12:40 +0100)
committerWim Taymans <wtaymans@redhat.com>
Thu, 20 Nov 2014 11:44:26 +0000 (12:44 +0100)
Check that a caps event string is 0 terminated and the event string is
terminated with a ; to avoid buffer overreads.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=737591

gst/rtp/gstrtpgstdepay.c

index 5803f982c6e6b437c89ebf2bc78f93af8becf522..a34088025f9c04d8ea307bc85dc3d2999f11f68a 100644 (file)
@@ -232,6 +232,9 @@ read_caps (GstRtpGSTDepay * rtpgstdepay, GstBuffer * buf, guint * skip)
   if (!read_length (rtpgstdepay, map.data, map.size, &length, &offset))
     goto too_small;
 
+  if (length == 0 || map.data[offset + length - 1] != '\0')
+    goto invalid_buffer;
+
   GST_DEBUG_OBJECT (rtpgstdepay, "parsing caps %s", &map.data[offset]);
 
   /* parse and store in cache */
@@ -249,6 +252,13 @@ too_small:
     gst_buffer_unmap (buf, &map);
     return NULL;
   }
+invalid_buffer:
+  {
+    GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE,
+        ("caps string not 0-terminated."), (NULL));
+    gst_buffer_unmap (buf, &map);
+    return NULL;
+  }
 }
 
 static GstEvent *
@@ -269,6 +279,9 @@ read_event (GstRtpGSTDepay * rtpgstdepay, guint type,
   if (!read_length (rtpgstdepay, map.data, map.size, &length, &offset))
     goto too_small;
 
+  if (length == 0 || map.data[offset + length - 1] != ';')
+    goto invalid_buffer;
+
   GST_DEBUG_OBJECT (rtpgstdepay, "parsing event %s", &map.data[offset]);
 
   /* parse */
@@ -307,6 +320,13 @@ too_small:
     gst_buffer_unmap (buf, &map);
     return NULL;
   }
+invalid_buffer:
+  {
+    GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE,
+        ("event string not 0-terminated."), (NULL));
+    gst_buffer_unmap (buf, &map);
+    return NULL;
+  }
 parse_failed:
   {
     GST_WARNING_OBJECT (rtpgstdepay, "could not parse event");