[glib] GDBusProxy: if a well-known name is not owned, don't GetAll from the dbus-daemon



commit 20387d262ff104f9de3defc264c5c2010d272857
Author: Simon McVittie <simon mcvittie collabora co uk>
Date:   Mon Aug 15 15:57:59 2011 +0100

    GDBusProxy: if a well-known name is not owned, don't GetAll from the dbus-daemon
    
    If you run:
    
        ( cd gio/tests && G_DBUS_DEBUG=all ./gdbus-proxy-well-known-name )
    
    you can see that in the case where the name com.example.TestService isn't
    owned yet, the GDBusProxy calls GetAll() with no destination, resulting
    in an error reply from the peer (the dbus-daemon itself). That's clearly
    not right!
    
    However, if priv->name is NULL, that indicates the special case where we
    really do want to talk directly to a peer, instead of via the bus daemon
    (most likely to be used on peer-to-peer connections); in that special
    case, do call GetAll().
    
    Signed-off-by: Simon McVittie <simon mcvittie collabora co uk>
    Signed-off-by: David Zeuthen <davidz redhat com>

 gio/gdbusproxy.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)
---
diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c
index a0e0180..f776662 100644
--- a/gio/gdbusproxy.c
+++ b/gio/gdbusproxy.c
@@ -1316,6 +1316,7 @@ async_init_get_name_owner_cb (GDBusConnection *connection,
                               gpointer         user_data)
 {
   AsyncInitData *data = user_data;
+  gboolean get_all;
 
   if (res != NULL)
     {
@@ -1350,7 +1351,25 @@ async_init_get_name_owner_cb (GDBusConnection *connection,
         }
     }
 
-  if (!(data->proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES))
+  get_all = TRUE;
+
+  if (data->proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES)
+    {
+      /* Don't load properties if the API user doesn't want them */
+      get_all = FALSE;
+    }
+  else if (data->proxy->priv->name_owner == NULL &&
+           data->proxy->priv->name != NULL)
+    {
+      /* Don't attempt to load properties if the name_owner is NULL (which
+       * usually means the name isn't owned), unless name is also NULL (which
+       * means we actually wanted to talk to the directly-connected process -
+       * either dbus-daemon or a peer - instead of going via dbus-daemon)
+       */
+        get_all = FALSE;
+    }
+
+  if (get_all)
     {
       /* load all properties asynchronously */
       g_dbus_connection_call (data->proxy->priv->connection,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]