From 2f7eb35f370bb79c12f229d109fc4dd2b74c9f47 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Fri, 29 Apr 2011 13:58:43 +0300 Subject: dbus: Fix the order of freeing stuff when unloading module-dbus-protocol. --- src/modules/dbus/module-dbus-protocol.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/modules') diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c index 276c6bae..4969585f 100644 --- a/src/modules/dbus/module-dbus-protocol.c +++ b/src/modules/dbus/module-dbus-protocol.c @@ -592,14 +592,20 @@ void pa__done(pa_module *m) { if (u->core_iface) pa_dbusiface_core_free(u->core_iface); - if (u->cleanup_event) - m->core->mainloop->defer_free(u->cleanup_event); - while ((c = pa_idxset_steal_first(u->connections, NULL))) connection_free(c); pa_idxset_free(u->connections, NULL, NULL); + /* This must not be called before the connections are freed, because if + * there are any connections left, they will emit the + * org.freedesktop.DBus.Local.Disconnected signal, and + * disconnection_filter_cb() will be called. disconnection_filter_cb() then + * tries to enable the defer event, and if it's already freed, an assertion + * will be hit in mainloop.c. */ + if (u->cleanup_event) + m->core->mainloop->defer_free(u->cleanup_event); + if (u->tcp_server) server_free(u->tcp_server); -- cgit