Explorar o código

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>
Marc-André Lureau %!s(int64=4) %!d(string=hai) anos
pai
achega
5e0a24e868
Modificáronse 1 ficheiros con 15 adicións e 10 borrados
  1. 15 10
      ui/vdagent.c

+ 15 - 10
ui/vdagent.c

@@ -721,22 +721,26 @@ static void vdagent_chr_accept_input(Chardev *chr)
     vdagent_send_buf(vd);
     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)
 static void vdagent_chr_set_fe_open(struct Chardev *chr, int fe_open)
 {
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(chr);
 
 
     if (!fe_open) {
     if (!fe_open) {
         trace_vdagent_close();
         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;
         return;
     }
     }
 
 
@@ -781,6 +785,7 @@ static void vdagent_chr_fini(Object *obj)
 {
 {
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
     VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj);
 
 
+    vdagent_disconnect(vd);
     buffer_free(&vd->outbuf);
     buffer_free(&vd->outbuf);
 }
 }