summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorMarc-André Lureau2021-08-05 15:57:06 +0200
committerMarc-André Lureau2021-08-31 15:25:14 +0200
commit5e0a24e8685892f52826567b216fe34f98bc9d58 (patch)
tree288ee321f98d79cdd59a4eb25abc7ba803314bf0 /ui
parentui/clipboard: release owned grabs on unregister (diff)
downloadqemu-5e0a24e8685892f52826567b216fe34f98bc9d58.tar.gz
qemu-5e0a24e8685892f52826567b216fe34f98bc9d58.tar.xz
qemu-5e0a24e8685892f52826567b216fe34f98bc9d58.zip
ui/vdagent: disconnect handlers and reset state on finalize
Avoid handlers being called with dangling pointers when the object is freed. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20210805135715.857938-10-marcandre.lureau@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'ui')
-rw-r--r--ui/vdagent.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/ui/vdagent.c b/ui/vdagent.c
index 5ae5734c81..1a29016e07 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -721,22 +721,26 @@ static void vdagent_chr_accept_input(Chardev *chr)
vdagent_send_buf(vd);
}
+static void vdagent_disconnect(VDAgentChardev *vd)
+{
+ vdagent_reset_bufs(vd);
+ vd->caps = 0;
+ if (vd->mouse_hs) {
+ qemu_input_handler_deactivate(vd->mouse_hs);
+ }
+ if (vd->cbpeer.update.notify) {
+ qemu_clipboard_peer_unregister(&vd->cbpeer);
+ memset(&vd->cbpeer, 0, sizeof(vd->cbpeer));
+ }
+}
+
static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
{
VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);
if (!fe_open) {
trace_vdagent_close();
- /* reset state */
- vdagent_reset_bufs(vd);
- vd->caps = 0;
- if (vd->mouse_hs) {
- qemu_input_handler_deactivate(vd->mouse_hs);
- }
- if (vd->cbpeer.update.notify) {
- qemu_clipboard_peer_unregister(&vd->cbpeer);
- memset(&vd->cbpeer, 0, sizeof(vd->cbpeer));
- }
+ vdagent_disconnect(vd);
return;
}
@@ -781,6 +785,7 @@ static void vdagent_chr_fini(Object *obj)
{
VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
+ vdagent_disconnect(vd);
buffer_free(&vd->outbuf);
}