From a6fc21fd1f8070046006998e8d78868b87c67032 Mon Sep 17 00:00:00 2001 From: Luiz Augusto Von Dentz Date: Fri, 8 Jan 2010 12:17:19 +0200 Subject: [PATCH] Fix regression when removing watches filter_data_find return the first data registered in this case so there is no guarantee that it return the same data as passed to filter_data_remove_callback which is the one that should be removed. The fix is to simple cache the connection removing the correct data before checking if there is any filter left. --- gdbus/watch.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/gdbus/watch.c b/gdbus/watch.c index 42e158fe..75e42103 100644 --- a/gdbus/watch.c +++ b/gdbus/watch.c @@ -299,6 +299,8 @@ static struct filter_callback *filter_data_add_callback( static gboolean filter_data_remove_callback(struct filter_data *data, struct filter_callback *cb) { + DBusConnection *connection; + data->callbacks = g_slist_remove(data->callbacks, cb); data->processed = g_slist_remove(data->processed, cb); @@ -315,16 +317,18 @@ static gboolean filter_data_remove_callback(struct filter_data *data, if (data->registered && !remove_match(data)) return FALSE; - /* Remove filter if there are no listeners left for the connection */ - data = filter_data_find(data->connection, NULL, NULL, NULL, NULL, - NULL); - if (!data) - dbus_connection_remove_filter(data->connection, message_filter, - NULL); - + connection = dbus_connection_ref(data->connection); listeners = g_slist_remove(listeners, data); filter_data_free(data); + /* Remove filter if there are no listeners left for the connection */ + data = filter_data_find(connection, NULL, NULL, NULL, NULL, NULL); + if (!data) + dbus_connection_remove_filter(connection, message_filter, + NULL); + + dbus_connection_unref(connection); + return TRUE; }