aboutsummaryrefslogtreecommitdiff
path: root/ui/vnc-clipboard.c
diff options
context:
space:
mode:
authorVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>2021-11-10 11:38:00 +0100
committerGerd Hoffmann <kraxel@redhat.com>2021-11-22 11:14:28 +0100
commit2e572baf659f5a457c876c6b2d02a217afb401c5 (patch)
treec78a5968bd2d5ba181b4cd1ea4e6bdef749559cc /ui/vnc-clipboard.c
parentc3abdb2faff62e3ded21bf8c3ef493ed70785623 (diff)
downloadqemu-2e572baf659f5a457c876c6b2d02a217afb401c5.zip
qemu-2e572baf659f5a457c876c6b2d02a217afb401c5.tar.gz
qemu-2e572baf659f5a457c876c6b2d02a217afb401c5.tar.bz2
ui/vnc-clipboard: fix adding notifier twice
vnc_server_cut_text_caps() is not guaranteed to be called only once. If it called twice, we finally call notifier_list_add() twice with same element. Which leads to loopback QLIST. So, on next notifier_list_notify() we'll loop forever and QEMU stuck. So, let's only register new notifier if it's not yet registered. Note, that similar check is used in vdagent_chr_recv_caps() (before call qemu_clipboard_peer_register()), and also before qemu_clipboard_peer_unregister() call in vdagent_disconnect() and in vnc_disconnect_finish(). Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20211110103800.2266729-1-vsementsov@virtuozzo.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'ui/vnc-clipboard.c')
-rw-r--r--ui/vnc-clipboard.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/ui/vnc-clipboard.c b/ui/vnc-clipboard.c
index 9f07796..67284b5 100644
--- a/ui/vnc-clipboard.c
+++ b/ui/vnc-clipboard.c
@@ -316,8 +316,10 @@ void vnc_server_cut_text_caps(VncState *vs)
caps[1] = 0;
vnc_clipboard_send(vs, 2, caps);
- vs->cbpeer.name = "vnc";
- vs->cbpeer.update.notify = vnc_clipboard_notify;
- vs->cbpeer.request = vnc_clipboard_request;
- qemu_clipboard_peer_register(&vs->cbpeer);
+ if (!vs->cbpeer.update.notify) {
+ vs->cbpeer.name = "vnc";
+ vs->cbpeer.update.notify = vnc_clipboard_notify;
+ vs->cbpeer.request = vnc_clipboard_request;
+ qemu_clipboard_peer_register(&vs->cbpeer);
+ }
}