gdbus: fix accessing freed callback data
authorJohan Hedberg <johan.hedberg@nokia.com>
Thu, 9 Dec 2010 19:52:54 +0000 (21:52 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 9 Dec 2010 23:07:30 +0000 (00:07 +0100)
cb->disc_func or cb->conn_func could remove the callback so this needs
to be checked for before continuing processing.

gdbus/watch.c

index e7c203a..9cb7ec7 100644 (file)
@@ -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);
        }