diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-04-05 15:25:55 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-08-17 19:18:38 +0100 |
commit | d3aa6c7942cce0cf7b602c6b0854488938f0548e (patch) | |
tree | 88d4a274d1395066545f0caef1f55d8790cc9938 /dbus | |
parent | 98b3b3f323fd4001be0630c3e0a1dc4fb83cdeab (diff) |
get_object_property: unwind on errors, and avoid returning NULL
Also treat all errors here as programming errors (because this method
should never fail), upgrading them from warning to critical; return a
D-Bus error reply anyway, to be nicer to our callers.
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=35766
Reviewed-by: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk>
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-gobject.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c index e416bda..7a62d2c 100644 --- a/dbus/dbus-gobject.c +++ b/dbus/dbus-gobject.c @@ -1074,6 +1074,7 @@ get_object_property (DBusConnection *connection, gchar *variant_sig; DBusMessage *ret; DBusMessageIter iter, subiter; + gchar *error_message = NULL; ret = reply_or_die (message); @@ -1084,9 +1085,10 @@ get_object_property (DBusConnection *connection, if (variant_sig == NULL) { value_gtype = G_VALUE_TYPE (&value); - g_warning ("Cannot marshal type \"%s\" in variant", g_type_name (value_gtype)); - g_value_unset (&value); - return ret; + error_message = g_strdup_printf ( + "Internal error: cannot marshal type \"%s\" in variant", + g_type_name (value_gtype)); + goto out; } dbus_message_iter_init_append (ret, &iter); @@ -1095,24 +1097,35 @@ get_object_property (DBusConnection *connection, variant_sig, &subiter)) { - g_free (variant_sig); - g_value_unset (&value); - return ret; + error_message = g_strdup_printf ( + "Internal error: cannot open variant container for signature %s", + variant_sig); + goto out; } if (!_dbus_gvalue_marshal (&subiter, &value)) { - dbus_message_unref (ret); - ret = dbus_message_new_error (message, - DBUS_ERROR_UNKNOWN_METHOD, - "Can't convert GType of object property to a D-BUS type"); + dbus_message_iter_abandon_container (&iter, &subiter); + error_message = g_strdup_printf ( + "Internal error: could not marshal type \"%s\" in variant", + G_VALUE_TYPE_NAME (&value)); + goto out; } dbus_message_iter_close_container (&iter, &subiter); +out: g_value_unset (&value); g_free (variant_sig); + if (error_message != NULL) + { + dbus_message_unref (ret); + ret = error_or_die (message, DBUS_ERROR_FAILED, error_message); + g_critical ("%s", error_message); + g_free (error_message); + } + return ret; } |