summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/modules/dbus/module-dbus-protocol.c12
1 files changed, 9 insertions, 3 deletions
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);