mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-20 17:22:11 +01:00
gvariant: Handle ^ay, ^&ay, ^aay, ^a&ay in g_variant_valist_free_nnp
g_variant_valist_free_nnp does not take into account ^*ay, which causes crash when trying to use these types together with g_variant_iter_loop().
This commit is contained in:
parent
741482085e
commit
46e493437c
@ -4662,7 +4662,15 @@ g_variant_valist_free_nnp (const gchar *str,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '^':
|
case '^':
|
||||||
if (str[2] != '&') /* '^as', '^ao' */
|
if (g_str_has_suffix (str, "y"))
|
||||||
|
{
|
||||||
|
if (str[2] != 'a') /* '^a&ay', '^ay' */
|
||||||
|
g_free (ptr);
|
||||||
|
else if (str[1] == 'a') /* '^aay' */
|
||||||
|
g_strfreev (ptr);
|
||||||
|
break; /* '^&ay' */
|
||||||
|
}
|
||||||
|
else if (str[2] != '&') /* '^as', '^ao' */
|
||||||
g_strfreev (ptr);
|
g_strfreev (ptr);
|
||||||
else /* '^a&s', '^a&o' */
|
else /* '^a&s', '^a&o' */
|
||||||
g_free (ptr);
|
g_free (ptr);
|
||||||
|
@ -3072,21 +3072,20 @@ test_varargs (void)
|
|||||||
g_variant_builder_add (&builder, "^aay", strvector);
|
g_variant_builder_add (&builder, "^aay", strvector);
|
||||||
g_variant_builder_add (&builder, "^aay", strvector);
|
g_variant_builder_add (&builder, "^aay", strvector);
|
||||||
value = g_variant_new ("aaay", &builder);
|
value = g_variant_new ("aaay", &builder);
|
||||||
g_variant_iter_init (&tuple, value);
|
array = g_variant_iter_new (value);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (g_variant_iter_loop (&tuple, "^aay", &my_strv)) {
|
while (g_variant_iter_loop (array, "^aay", &my_strv))
|
||||||
i++;
|
i++;
|
||||||
}
|
|
||||||
g_assert (i == 3);
|
g_assert (i == 3);
|
||||||
|
|
||||||
/* start over */
|
/* start over */
|
||||||
g_variant_iter_init (&tuple, value);
|
g_variant_iter_init (array, value);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (g_variant_iter_loop (&tuple, "^a&ay", &strv)) {
|
while (g_variant_iter_loop (array, "^a&ay", &strv))
|
||||||
i++;
|
i++;
|
||||||
}
|
|
||||||
g_assert (i == 3);
|
g_assert (i == 3);
|
||||||
g_variant_unref (value);
|
g_variant_unref (value);
|
||||||
|
g_variant_iter_free (array);
|
||||||
|
|
||||||
/* next test */
|
/* next test */
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay"));
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user