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.
This commit is contained in:
Luiz Augusto Von Dentz 2010-01-08 12:17:19 +02:00 committed by Marcel Holtmann
parent 20db731484
commit a6fc21fd1f
1 changed files with 11 additions and 7 deletions

View File

@ -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;
}