gstvalue: don't write to const char *
authorMathieu Duponchelle <mathieu@centricular.com>
Mon, 12 Oct 2020 23:19:47 +0000 (01:19 +0200)
committerMathieu Duponchelle <mathieu@centricular.com>
Mon, 12 Oct 2020 23:19:47 +0000 (01:19 +0200)
Our various deserializing functions require NULL terminators
to not over consume substrings (eg fields of an array). Instead
of writing a NULL terminator to the passed-in string, which may
result in segfaults, make a copy of the substring we're interested
in.

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

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

gst/gstvalue.c

index adc7d7e..a6ddfca 100644 (file)
@@ -2717,8 +2717,7 @@ _priv_gst_value_parse_value (gchar * str,
       if (G_UNLIKELY (!_priv_gst_value_parse_string (s, &value_end, &s, TRUE)))
         return FALSE;
       /* Set NULL terminator for deserialization */
-      c = *value_end;
-      *value_end = '\0';
+      value_s = g_strndup (value_s, value_end - value_s);
 
       for (i = 0; i < G_N_ELEMENTS (try_types); i++) {
         g_value_init (value, try_types[i]);
@@ -2734,14 +2733,13 @@ _priv_gst_value_parse_value (gchar * str,
                   (type != G_TYPE_STRING))))
         return FALSE;
       /* Set NULL terminator for deserialization */
-      c = *value_end;
-      *value_end = '\0';
+      value_s = g_strndup (value_s, value_end - value_s);
 
       ret = gst_value_deserialize_with_pspec (value, value_s, pspec);
       if (G_UNLIKELY (!ret))
         g_value_unset (value);
     }
-    *value_end = c;
+    g_free (value_s);
   }
 
   *after = s;