g_variant_get_child(): flatten-first logic on '&'

Copy the flatten-first logic from g_variant_get(), and for the same
reason: if the user is requesting a direct pointer access to a
tree-based child inside of argument to this function then that child
could disappear later.

Forcing serialisation means that the pointer will remain valid as long
as the passed-in instance exists, which is the usual expectation with
GVariant API.

https://bugzilla.gnome.org/show_bug.cgi?id=755374
This commit is contained in:
Ryan Lortie 2015-09-21 16:54:49 -04:00
parent 3c0d38d68b
commit 56b164a195

View File

@ -5446,6 +5446,10 @@ g_variant_get_child (GVariant *value,
GVariant *child;
va_list ap;
/* if any direct-pointer-access formats are in use, flatten first */
if (strchr (format_string, '&'))
g_variant_get_data (value);
child = g_variant_get_child_value (value, index_);
g_return_if_fail (valid_format_string (format_string, TRUE, child));