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 */