[telepathy-mission-control/master] McdAccountManager: don't create accounts with object paths that are still in use

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Apr 7 11:28:21 PDT 2009


There seems to be no way to remove a GObject from dbus-glib other than
letting it be disposed. If it isn't unreffed immediately (or if there's
a leak), it's possible that the object path will still be in use even
though it's been removed from the config file.
---
 src/mcd-account-manager.c |   16 ++++++++++++----
 1 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/mcd-account-manager.c b/src/mcd-account-manager.c
index ee2b055..ddfc6d5 100644
--- a/src/mcd-account-manager.c
+++ b/src/mcd-account-manager.c
@@ -358,6 +358,9 @@ create_unique_name (McdAccountManagerPrivate *priv, const gchar *manager,
     gchar *esc_manager, *esc_protocol, *esc_base;
     GValue *value;
     gint i, len;
+    gsize base_len = sizeof (MC_ACCOUNT_DBUS_OBJECT_BASE) - 1;
+    DBusGConnection *connection = tp_proxy_get_dbus_connection (
+        priv->dbus_daemon);
 
     value = g_hash_table_lookup (params, "account");
     if (value)
@@ -370,9 +373,11 @@ create_unique_name (McdAccountManagerPrivate *priv, const gchar *manager,
     esc_protocol = tp_escape_as_identifier (protocol);
     esc_base = tp_escape_as_identifier (base);
     /* add two chars for the "/" */
-    len = strlen (esc_manager) + strlen (esc_protocol) + strlen (esc_base) + 2;
+    len = strlen (esc_manager) + strlen (esc_protocol) + strlen (esc_base)
+        + base_len + 2;
     path = g_malloc (len + 5);
-    sprintf (path, "%s/%s/%s", esc_manager, esc_protocol, esc_base);
+    sprintf (path, "%s%s/%s/%s", MC_ACCOUNT_DBUS_OBJECT_BASE,
+             esc_manager, esc_protocol, esc_base);
     g_free (esc_manager);
     g_free (esc_protocol);
     g_free (esc_base);
@@ -380,12 +385,15 @@ create_unique_name (McdAccountManagerPrivate *priv, const gchar *manager,
     for (i = 0; i < 1024; i++)
     {
 	sprintf (seq, "%u", i);
-	if (!g_key_file_has_group (priv->keyfile, path))
+	if (!g_key_file_has_group (priv->keyfile, path) &&
+            dbus_g_connection_lookup_g_object (connection, path)
+                == NULL)
 	{
-	    unique_name = path;
+	    unique_name = g_strdup (path + base_len);
 	    break;
 	}
     }
+    g_free (path);
     return unique_name;
 }
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list