GVariant: Check for size == 0 in get_bytestring
authorRyan Lortie <desrt@desrt.ca>
Tue, 14 Sep 2010 18:55:38 +0000 (14:55 -0400)
committerRyan Lortie <desrt@desrt.ca>
Tue, 14 Sep 2010 18:56:38 +0000 (14:56 -0400)
And add a test from David that shows the problem.

Closes #629698

glib/gvariant.c
glib/tests/gvariant.c

index 133bfa1..f9eb851 100644 (file)
@@ -1368,7 +1368,7 @@ g_variant_get_bytestring (GVariant *value)
   string = g_variant_get_data (value);
   size = g_variant_get_size (value);
 
-  if (string[size - 1] == '\0')
+  if (size && string[size - 1] == '\0')
     return string;
   else
     return "";
index 7e228ac..74eee40 100644 (file)
@@ -3819,6 +3819,8 @@ test_bytestring (void)
   GVariant *value;
   gchar **strv;
   gchar *str;
+  const gchar *const_str;
+  GVariant *untrusted_empty;
 
   strv = g_strsplit (test_string, ",", 0);
 
@@ -3884,6 +3886,12 @@ test_bytestring (void)
   g_variant_get_child (value, 3, "^&ay", &str);
   g_assert_cmpstr (str, ==, "foo");
   g_variant_unref (value);
+
+  untrusted_empty = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), NULL, 0, FALSE, NULL, NULL);
+  value = g_variant_get_normal_form (untrusted_empty);
+  const_str = g_variant_get_bytestring (value);
+  g_variant_unref (value);
+  g_variant_unref (untrusted_empty);
 }
 
 int