ebml: Validate 7-bit ASCII in gst_ebml_read_ascii
authorPhilip Jägenstedt <philipj@opera.com>
Wed, 12 May 2010 11:16:28 +0000 (13:16 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 19 May 2010 18:33:38 +0000 (20:33 +0200)
This was triggering an UTF-8 assertion in gst_caps_set_simple for
corrupt files with garbage as codec id. Test case:
gstreamer_error_trying_to_set_invalid_utf8_as_codec_id.webm

Old gst_ebml_read_ascii renamed to gst_ebml_read_string, also used by
gst_ebml_read_utf8. Unlike for UTF-8, failure to validate is an error,
as gst_ebml_read_ascii is used for reading doctype and codec id and we
might just as well give up early in those cases.

gst/matroska/ebml-read.c

index 5a8eea5..e53027a 100644 (file)
@@ -776,11 +776,11 @@ gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num)
 }
 
 /*
- * Read the next element as an ASCII string.
+ * Read the next element as a C string.
  */
 
-GstFlowReturn
-gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str)
+static GstFlowReturn
+gst_ebml_read_string (GstEbmlRead * ebml, guint32 * id, gchar ** str)
 {
   guint8 *data;
   guint size;
@@ -798,6 +798,36 @@ gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str)
 }
 
 /*
+ * Read the next element as an ASCII string.
+ */
+
+GstFlowReturn
+gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str)
+{
+  GstFlowReturn ret;
+  gchar *iter;
+
+#ifndef GST_DISABLE_GST_DEBUG
+  guint64 oldoff = ebml->offset;
+#endif
+
+  ret = gst_ebml_read_string (ebml, id, str);
+  if (ret != GST_FLOW_OK)
+    return ret;
+
+  for (iter = *str; *iter != '\0'; iter++) {
+    if (G_UNLIKELY (*iter & 0x80)) {
+      GST_ERROR_OBJECT (ebml,
+          "Invalid ASCII string at offset %" G_GUINT64_FORMAT, oldoff);
+      g_free (*str);
+      return GST_FLOW_ERROR;
+    }
+  }
+
+  return ret;
+}
+
+/*
  * Read the next element as a UTF-8 string.
  */
 
@@ -810,7 +840,7 @@ gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str)
   guint64 oldoff = ebml->offset;
 #endif
 
-  ret = gst_ebml_read_ascii (ebml, id, str);
+  ret = gst_ebml_read_string (ebml, id, str);
   if (ret != GST_FLOW_OK)
     return ret;