diff options
author | Travis Reitter <treitter@gmail.com> | 2009-12-11 08:25:26 -0800 |
---|---|---|
committer | Travis Reitter <treitter@gmail.com> | 2009-12-11 08:25:26 -0800 |
commit | 100a0f0ba3a4fae09a8ad6b72808e86a7676547e (patch) | |
tree | f324d52f19b76503431a51734945a1caa57dd35f | |
parent | de6b40dfa08770b50431ed56055d2cf158d91c5c (diff) | |
download | evolution-data-server-100a0f0ba3a4fae09a8ad6b72808e86a7676547e.tar.gz |
Fix a nasty e-addressbook-factory crasher based on a double-free.
-rw-r--r-- | addressbook/libedata-book/e-data-book-factory.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/addressbook/libedata-book/e-data-book-factory.c b/addressbook/libedata-book/e-data-book-factory.c index d5e891f83..3bd980498 100644 --- a/addressbook/libedata-book/e-data-book-factory.c +++ b/addressbook/libedata-book/e-data-book-factory.c @@ -367,11 +367,14 @@ name_owner_changed (DBusGProxy *proxy, gchar *key; GList *list = NULL; g_mutex_lock (factory->priv->connections_lock); - if (g_hash_table_lookup_extended (factory->priv->connections, prev_owner, (gpointer)&key, (gpointer)&list)) { - g_list_foreach (list, (GFunc)g_object_unref, NULL); - g_list_free (list); - g_hash_table_remove (factory->priv->connections, prev_owner); + while (g_hash_table_lookup_extended (factory->priv->connections, prev_owner, (gpointer)&key, (gpointer)&list)) { + /* this should trigger the book's weak ref notify + * function, which will remove it from the list before + * it's freed, and will remove the connection from + * priv->connections once they're all gone */ + g_object_unref (list->data); } + g_mutex_unlock (factory->priv->connections_lock); } } |