Commit b6506de40f for qemu.org
commit b6506de40f475bd5befe086ac94b4ceac83040a8
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Tue Mar 3 17:41:12 2026 +0100
ui/dbus-listener: remove dbus_filter on connection close
The dbus filter holds a strong reference to the DBusDisplayListener
(via GDestroyNotify) to ensure the listener remains alive while the
filter may still be running in another thread. This creates a
reference cycle (ddl -> conn -> filter -> ddl) that prevents the
listener from being freed.
Break the cycle by connecting to the connection's "closed" signal
and removing the filter when the connection closes.
Fixes: commit fa88b85dea96 ("ui/dbus: filter out pending messages when scanout")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/ui/dbus-listener.c b/ui/dbus-listener.c
index fff7cf8327..37945236e1 100644
--- a/ui/dbus-listener.c
+++ b/ui/dbus-listener.c
@@ -1181,6 +1181,20 @@ static void dbus_display_listener_setup_scanout_dmabuf_v2(DBusDisplayListener *d
#endif
}
+static void
+dbus_conn_closed(GDBusConnection *conn,
+ gboolean remote_peer_vanished,
+ GError *error,
+ gpointer user_data)
+{
+ DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(user_data);
+
+ if (ddl->dbus_filter) {
+ g_dbus_connection_remove_filter(ddl->conn, ddl->dbus_filter);
+ ddl->dbus_filter = 0;
+ }
+}
+
static GDBusMessage *
dbus_filter(GDBusConnection *connection,
GDBusMessage *message,
@@ -1262,6 +1276,7 @@ dbus_display_listener_new(const char *bus_name,
}
ddl->dbus_filter = g_dbus_connection_add_filter(conn, dbus_filter, g_object_ref(ddl), g_object_unref);
+ g_signal_connect(conn, "closed", G_CALLBACK(dbus_conn_closed), ddl);
ddl->bus_name = g_strdup(bus_name);
ddl->conn = conn;
ddl->console = console;