diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2010-12-09 21:52:54 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2010-12-09 22:02:30 +0200 |
commit | 986ff02852aa3155efd614568c3d816fad51b0f9 (patch) | |
tree | 9c4b6e231eaafe08e796481b2b14cc583788df53 /gdbus | |
parent | d599b9e2b8efcb5130dc33b786eba45e9393f490 (diff) |
gdbus: fix accessing freed callback data
cb->disc_func or cb->conn_func could remove the callback so this needs
to be checked for before continuing processing.
Diffstat (limited to 'gdbus')
-rw-r--r-- | gdbus/watch.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/gdbus/watch.c b/gdbus/watch.c index e7c203ae..9cb7ec70 100644 --- a/gdbus/watch.c +++ b/gdbus/watch.c @@ -477,6 +477,11 @@ static DBusHandlerResult service_filter(DBusConnection *connection, cb->conn_func(connection, cb->user_data); } + /* Check if the watch was removed/freed by the callback + * function */ + if (!g_slist_find(data->callbacks, cb)) + continue; + /* Only auto remove if it is a bus name watch */ if (data->argument[0] == ':' && (cb->conn_func == NULL || cb->disc_func == NULL)) { @@ -484,11 +489,6 @@ static DBusHandlerResult service_filter(DBusConnection *connection, continue; } - /* Check if the watch was removed/freed by the callback - * function */ - if (!g_slist_find(data->callbacks, cb)) - continue; - data->callbacks = g_slist_remove(data->callbacks, cb); data->processed = g_slist_append(data->processed, cb); } |