typefind/xdgmime: Validate mimetypes to be valid GstStructure names before using...
authorSebastian Dröge <sebastian@centricular.com>
Sat, 17 Oct 2020 07:42:49 +0000 (10:42 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Sat, 17 Oct 2020 07:42:49 +0000 (10:42 +0300)
On macOS, for example, "text/*" can be returned as mimetype for
plaintext files but we don't allow '*' in structure names and this would
cause critical warnings.

It's a valid mimetype but not a valid structure name.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/616

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/875>

gst/typefind/gsttypefindfunctions.c

index cbb0312..3ef051c 100644 (file)
@@ -5404,6 +5404,26 @@ vivo_type_find (GstTypeFind * tf, gpointer unused)
 /*** XDG MIME typefinder (to avoid false positives mostly) ***/
 
 #ifdef USE_GIO
+static gboolean
+xdgmime_validate_name (const gchar * name)
+{
+  const gchar *s;
+
+  if (G_UNLIKELY (!g_ascii_isalpha (*name))) {
+    return FALSE;
+  }
+
+  /* FIXME: test name string more */
+  s = &name[1];
+  while (*s && (g_ascii_isalnum (*s) || strchr ("/-_.:+", *s) != NULL))
+    s++;
+  if (G_UNLIKELY (*s != '\0')) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
 static void
 xdgmime_typefind (GstTypeFind * find, gpointer user_data)
 {
@@ -5448,6 +5468,12 @@ xdgmime_typefind (GstTypeFind * find, gpointer user_data)
     return;
   }
 
+  if (!xdgmime_validate_name (mimetype)) {
+    GST_LOG ("Ignoring mimetype with invalid structure name");
+    g_free (mimetype);
+    return;
+  }
+
   /* Again, we mainly want the xdg typefinding to prevent false-positives on
    * non-media formats, so suggest the type with a probability that trumps
    * uncertain results of our typefinders, but not more than that. */