@samitouri / QOSamiQemu / commits / e5ef268596

ui/dbus: tear down clipboard callbacks on display finalize

The clipboard D-Bus teardown path currently runs when the peer disappears, but not when DBusDisplay itself is finalized. That leaves pending clipboard requests and signal handlers associated with the clipboard proxy active past display teardown. Add an explicit clipboard fini hook and invoke it from dbus_display_finalize() so the clipboard teardown also runs during display destruction. bixes: ff1a5810f61f ("ui/dbus: add clipboard interface") Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn> Message-ID: <20260330091310.42868-1-zhaoguohan@kylinos.cn> [ Marc-André - Move clipobard finalization to the function] Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

GuoHan Zhao committed Mar 30, 2026 at 17:13 UTC e5ef268596c33db43bf7ddedf23974af81d7315b
3 files changed +18 -2
ui/dbus-clipboard.c
+16
@@ -191,6 +191,7 @@ static void
191 dbus_clipboard_unregister_proxy(DBusDisplay *dpy)
192 {
193 const char *name = NULL;
194 + GDBusConnection *connection = NULL;
195 int i;
196
197 for (i = 0; i < G_N_ELEMENTS(dpy->clipboard_request); ++i) {
@@ -201,6 +202,13 @@ dbus_clipboard_unregister_proxy(DBusDisplay *dpy)
202 return;
203 }
204
205 + connection = g_dbus_proxy_get_connection(
206 + G_DBUS_PROXY(dpy->clipboard_proxy));
207 + if (connection) {
208 + g_signal_handlers_disconnect_by_data(connection, dpy);
209 + }
210 + g_signal_handlers_disconnect_by_data(dpy->clipboard_proxy, dpy);
211 +
212 name = g_dbus_proxy_get_name(G_DBUS_PROXY(dpy->clipboard_proxy));
213 trace_dbus_clipboard_unregister(name);
214 g_clear_object(&dpy->clipboard_proxy);
@@ -425,6 +433,14 @@ dbus_clipboard_request(
433 return DBUS_METHOD_INVOCATION_HANDLED;
434 }
435
436 +void
437 +dbus_clipboard_fini(DBusDisplay *dpy)
438 +{
439 + dbus_clipboard_unregister_proxy(dpy);
440 + qemu_clipboard_peer_unregister(&dpy->clipboard_peer);
441 + g_clear_object(&dpy->clipboard);
442 +}
443 +
444 void
445 dbus_clipboard_init(DBusDisplay *dpy)
446 {
ui/dbus.c
+1 -2
@@ -145,8 +145,7 @@ dbus_display_finalize(Object *o)
145 dbus_display_notifier_remove(&dd->notifier);
146 }
147
148 - qemu_clipboard_peer_unregister(&dd->clipboard_peer);
149 - g_clear_object(&dd->clipboard);
148 + dbus_clipboard_fini(dd);
149
150 g_clear_object(&dd->server);
151 g_clear_pointer(&dd->consoles, g_ptr_array_unref);
ui/dbus.h
+1
@@ -150,5 +150,6 @@ void dbus_display_notify(DBusDisplayEvent *event);
150 void dbus_chardev_init(DBusDisplay *dpy);
151
152 void dbus_clipboard_init(DBusDisplay *dpy);
153 +void dbus_clipboard_fini(DBusDisplay *dpy);
154
155 #endif /* UI_DBUS_H */