summaryrefslogtreecommitdiffstats
path: root/glib
diff options
context:
space:
mode:
Diffstat (limited to 'glib')
-rw-r--r--glib/dbus-gmain.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/glib/dbus-gmain.c b/glib/dbus-gmain.c
index 6697c125..5766139d 100644
--- a/glib/dbus-gmain.c
+++ b/glib/dbus-gmain.c
@@ -89,11 +89,13 @@ dbus_connection_dispatch (GSource *source,
gpointer user_data)
{
DBusGSource *dbus_source = (DBusGSource *)source;
-
- GList *list;
+ GList *copy, *list;
- list = dbus_source->poll_fds;
+ /* We need to traverse a copy of the list, since it can change in
+ dbus_connect_handle_watch. */
+ copy = g_list_copy (dbus_source->poll_fds);
+ list = copy;
while (list)
{
GPollFD *poll_fd = list->data;
@@ -114,10 +116,12 @@ dbus_connection_dispatch (GSource *source,
dbus_connection_handle_watch (dbus_source->connection, watch, condition);
}
-
+
list = list->next;
}
+ g_list_free (copy);
+
/* Dispatch messages */
while (dbus_connection_dispatch_message (dbus_source->connection));