Return an error for calls into unknown interfaces or unknown objects
authorDavid Zeuthen <davidz@redhat.com>
Fri, 21 May 2010 16:09:27 +0000 (12:09 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Fri, 21 May 2010 16:11:04 +0000 (12:11 -0400)
Ryan pointed out on IRC that we didn't do anything here. Looking at
the code, it's painfully obvious that we should be returning an error
here since a comment already says that we've exhausted all possible
options.

Signed-off-by: David Zeuthen <davidz@redhat.com>
gio/gdbusconnection.c
gio/tests/gdbus-export.c

index 7bc7224..346afcf 100644 (file)
@@ -5088,6 +5088,7 @@ static void
 distribute_method_call (GDBusConnection *connection,
                         GDBusMessage    *message)
 {
+  GDBusMessage *reply;
   ExportedObject *eo;
   ExportedSubtree *es;
   const gchar *object_path;
@@ -5154,7 +5155,14 @@ distribute_method_call (GDBusConnection *connection,
   if (handle_generic_unlocked (connection, message))
     goto out;
 
-  /* if we end up here, the message has not been not handled */
+  /* if we end up here, the message has not been not handled - so return an error saying this */
+  reply = g_dbus_message_new_method_error (message,
+                                           "org.freedesktop.DBus.Error.UnknownMethod",
+                                           _("No such interface `%s' on object at path %s"),
+                                           interface_name,
+                                           object_path);
+  g_dbus_connection_send_message_unlocked (connection, reply, NULL, NULL);
+  g_object_unref (reply);
 
  out:
   g_free (subtree_path);
index 3041527..b067cee 100644 (file)
@@ -824,6 +824,18 @@ test_dispatch_thread_func (gpointer user_data)
   g_error_free (error);
   g_assert (value == NULL);
 
+  error = NULL;
+  value = g_dbus_proxy_call_sync (foo_proxy,
+                                  "org.example.FooXYZ.NonExistant",
+                                  NULL,
+                                  G_DBUS_CALL_FLAGS_NONE,
+                                  -1,
+                                  NULL,
+                                  &error);
+  g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
+  g_error_free (error);
+  g_assert (value == NULL);
+
   /* user properties */
   error = NULL;
   value = g_dbus_proxy_call_sync (foo_proxy,