From 818741a749088ae83c530ad2d86098619d1fb537 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 22 Apr 2010 13:26:44 -0700 Subject: [PATCH] core: don't pass malformed error interface to dbus (rh#581794) While clients should really register their errors, dbus-glib shouldn't be passing a malformed error interface to dbus either. It's just not nice and libdbus will call abort(). See https://bugzilla.redhat.com/show_bug.cgi?id=581794 --- dbus/dbus-gobject.c | 12 ++++++++---- test/core/my-object.c | 12 ++++++++++++ test/core/my-object.h | 1 + test/core/test-dbus-glib.c | 8 ++++++++ test/core/test-service-glib.xml | 3 +++ 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c index 5f13f3a..a0cf1e6 100644 --- a/dbus/dbus-gobject.c +++ b/dbus/dbus-gobject.c @@ -1224,10 +1224,14 @@ gerror_domaincode_to_dbus_error_name (const DBusGObjectInfo *object_info, dbus_error_name = g_string_new ("org.freedesktop.DBus.GLib.UnmappedError."); domain_from_quark = uscore_to_wincaps (g_quark_to_string (domain)); - g_string_append (dbus_error_name, domain_from_quark); - g_free (domain_from_quark); - - g_string_append_printf (dbus_error_name, ".Code%d", code); + if (domain_from_quark && domain_from_quark[0] != '\0') + { + g_string_append (dbus_error_name, domain_from_quark); + g_string_append_c (dbus_error_name, '.'); + g_free (domain_from_quark); + } + + g_string_append_printf (dbus_error_name, "Code%d", code); } else { diff --git a/test/core/my-object.c b/test/core/my-object.c index 886943e..0fa8277 100644 --- a/test/core/my-object.c +++ b/test/core/my-object.c @@ -246,6 +246,18 @@ my_object_throw_error_multi_word (MyObject *obj, GError **error) return FALSE; } +gboolean +my_object_throw_unregistered_error (MyObject *obj, GError **error) +{ + /* Unregistered errors shouldn't cause a dbus abort. See + * https://bugzilla.redhat.com/show_bug.cgi?id=581794 + */ + g_set_error (error, 0, 0, + "%s", + "this method always loses more"); + return FALSE; +} + gboolean my_object_uppercase (MyObject *obj, const char *str, char **ret, GError **error) diff --git a/test/core/my-object.h b/test/core/my-object.h index 1d3c869..df82b66 100644 --- a/test/core/my-object.h +++ b/test/core/my-object.h @@ -52,6 +52,7 @@ gint32 my_object_increment_retval_error (MyObject *obj, gint32 x, GError **err gboolean my_object_throw_error (MyObject *obj, GError **error); gboolean my_object_throw_not_supported (MyObject *obj, GError **error); gboolean my_object_throw_error_multi_word (MyObject *obj, GError **error); +gboolean my_object_throw_unregistered_error (MyObject *obj, GError **error); gboolean my_object_uppercase (MyObject *obj, const char *str, char **ret, GError **error); diff --git a/test/core/test-dbus-glib.c b/test/core/test-dbus-glib.c index 6de156c..0376f0d 100644 --- a/test/core/test-dbus-glib.c +++ b/test/core/test-dbus-glib.c @@ -796,6 +796,14 @@ main (int argc, char **argv) g_print ("ThrowNotSupported correctly returned error: %s\n", error->message); g_clear_error (&error); + g_print ("Calling ThrowUnregisteredError\n"); + if (dbus_g_proxy_call (proxy, "ThrowUnregisteredError", &error, + G_TYPE_INVALID, G_TYPE_INVALID) != FALSE) + lose ("ThrowError call unexpectedly succeeded!"); + + g_print ("ThrowUnregisteredError failed (as expected) returned error: %s\n", error->message); + g_clear_error (&error); + g_print ("Calling IncrementRetvalError (for error)\n"); error = NULL; v_UINT32_2 = 0; diff --git a/test/core/test-service-glib.xml b/test/core/test-service-glib.xml index 5bc94a6..3bd2de3 100644 --- a/test/core/test-service-glib.xml +++ b/test/core/test-service-glib.xml @@ -35,6 +35,9 @@ + + + -- 1.6.6.1