From 56b164a19566a63dda23d48a93b91875d89c9fde Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Mon, 21 Sep 2015 16:54:49 -0400 Subject: [PATCH] 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 --- glib/gvariant.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/glib/gvariant.c b/glib/gvariant.c index a9c34d460..85bb1ca90 100644 --- a/glib/gvariant.c +++ b/glib/gvariant.c @@ -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));