summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Crequy <alban.crequy@collabora.co.uk>2014-07-29 11:16:47 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-09-05 16:45:23 +0100
commit7678b6f8f43789a880147749bd4b6dc3454d4dec (patch)
tree6596d0cb98cee660be7f0a8d392eb0b9dbe53b6a
parent7b81cf6445b0802c582dfca4a7e5afec5c9c389e (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.c23
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;
}