aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2010-12-09 21:52:54 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-12-10 00:08:26 +0100
commit0586e1ae6ff7a1ec502373bffeca54624507fc73 (patch)
tree8a075ce7c44512145086d1b9d44fd534c854fc16
parente5eab88a78ed3dcb60be61a84fd1fbc50fc7b90a (diff)
downloadpacrunner-0586e1ae6ff7a1ec502373bffeca54624507fc73.tar.gz
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.
-rw-r--r--gdbus/watch.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/gdbus/watch.c b/gdbus/watch.c
index e7c203a..9cb7ec7 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);
}