dbus: Fix the order of freeing stuff when unloading module-dbus-protocol.
authorTanu Kaskinen <tanu.kaskinen@digia.com>
Fri, 29 Apr 2011 10:58:43 +0000 (13:58 +0300)
committerColin Guthrie <colin@mageia.org>
Fri, 29 Apr 2011 11:38:43 +0000 (12:38 +0100)
src/modules/dbus/module-dbus-protocol.c

index 276c6ba..4969585 100644 (file)
@@ -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);