diff options
author | Alban Crequy <alban.crequy@collabora.co.uk> | 2014-07-29 11:16:47 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-09-05 16:45:23 +0100 |
commit | 7678b6f8f43789a880147749bd4b6dc3454d4dec (patch) | |
tree | 6596d0cb98cee660be7f0a8d392eb0b9dbe53b6a | |
parent | 7b81cf6445b0802c582dfca4a7e5afec5c9c389e (diff) |
demarshal_static_variant: fail gracefully with unknown message types
Refuse to demarshal variants containing unknown types such as DBUS_TYPE_UNIX_FD
or DBUS_TYPE_MAYBE. Otherwise we will not be able to free them automatically
with g_value_unset.
Symptoms:
> GLib-GObject-CRITICAL **: g_value_unset: assertion 'G_IS_VALUE (value)' failed
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=80557
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r-- | dbus/dbus-gvalue.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/dbus/dbus-gvalue.c b/dbus/dbus-gvalue.c index 7f1fc89..6641618 100644 --- a/dbus/dbus-gvalue.c +++ b/dbus/dbus-gvalue.c @@ -647,17 +647,24 @@ demarshal_static_variant (DBusGValueMarshalCtx *context, sig = dbus_message_iter_get_signature (&subiter); variant_type = _dbus_gtype_from_signature (sig, context->proxy != NULL); - if (variant_type != G_TYPE_INVALID) + if (variant_type == G_TYPE_INVALID) { - g_value_init (value, variant_type); - - if (!_dbus_gvalue_demarshal (context, &subiter, value, error)) - { - dbus_free (sig); - return FALSE; - } + /* It can happen if we received an unknown type such as + * DBUS_TYPE_UNIX_FD or DBUS_TYPE_MAYBE. */ + g_set_error (error, DBUS_GERROR, + DBUS_GERROR_INVALID_SIGNATURE, + "Variant contains unknown signature \'%s\'", sig); + dbus_free (sig); + return FALSE; } + dbus_free (sig); + + g_value_init (value, variant_type); + + if (!_dbus_gvalue_demarshal (context, &subiter, value, error)) + return FALSE; + return TRUE; } |