From nobody Fri Nov 14 18:21:19 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1761570533; cv=none; d=zohomail.com; s=zohoarc; b=ftPn18WcCXRzoKzokgadoUAZOW7ANQMUulDO0qLlMTPgt3F0bRKWxPlTcEdvd+4aHQkLqtnzsfMfACV1n1Uy1ACN7TdPwSbaLWy6O8UqoYbUAIxguX62hfCGtkwiw6X7S2odq3f1hSZ74urh8Ds8YQg27lysIc5fFTtIp1F0eAU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761570533; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ArptGLNbeysXm661zZ0Lhh9qH67InwXtub6Pp1xxeLs=; b=Q4/EUPS8t0MLVYdSVbu4Fj9BOJB8TKoDLMGwookfssEoMv0XDry9hmw1JXq4Fj8FEowaJ3qwgkJ0TaW/NcWWsDTskc+ym70w3P/HzU1/KjiB5r2hU5Vci/I8C1cYcYBbqt2ZnCNk42DZdG/emK49VsBxk6nBDZ6Bi+YJHEovC5c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761570533463207.57304515054454; Mon, 27 Oct 2025 06:08:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vDMxL-0005Xx-8k; Mon, 27 Oct 2025 09:08:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vDMxG-0005TO-SO for qemu-devel@nongnu.org; Mon, 27 Oct 2025 09:08:10 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vDMxA-0002oB-8W for qemu-devel@nongnu.org; Mon, 27 Oct 2025 09:08:10 -0400 Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-110-KWLb6lwUObypS0P5BakY4g-1; Mon, 27 Oct 2025 09:07:50 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id BACEA19560AF; Mon, 27 Oct 2025 13:07:49 +0000 (UTC) Received: from localhost (unknown [10.45.242.5]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6D41D1800579; Mon, 27 Oct 2025 13:07:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1761570474; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ArptGLNbeysXm661zZ0Lhh9qH67InwXtub6Pp1xxeLs=; b=I0/n2NAmoCoig7+6TXD7ywkB4xOGfwiq8iCiDE2CFOp8qMUyT9/EYGBB1PSvwDqcmqe7aS 9CAAzINifb80d+EjfMsYMIGBFL1U3bn7LAc4KKoIrZfGHVDsG/fBaiCuEa9w0sXFIqtfCo 4pIC3G6DQJZtSZYMUCzX0vWLO4p3oBk= X-MC-Unique: KWLb6lwUObypS0P5BakY4g-1 X-Mimecast-MFC-AGG-ID: KWLb6lwUObypS0P5BakY4g_1761570469 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Cc: lucas.kornicki@nutanix.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PATCH] ui/vdagent: fix windows agent regression Date: Mon, 27 Oct 2025 17:07:44 +0400 Message-ID: <20251027130744.2714610-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1761570548831158500 From: Marc-Andr=C3=A9 Lureau Since commit f626116f ("ui/vdagent: factor out clipboard peer registration"), the QEMU clipboard serial is reset whenever the vdagent chardev receives the guest caps. This triggers a CHR_EVENT_CLOSED which is handled by virtio_serial_close() to notify the guest. The "reconnection logic" is there to reset the agent when a client (dbus, spice etc) reconnects, or the agent is restarted. It is required to sync the clipboard serials and to prevent races or loops due to clipboard managers on both ends (but this is not implemented by windows vdagent). The Unix agent has been reconnecting without resending caps, thus working with this approach. However, the Windows agent does not seem to have a way to handle VIRTIO_CONSOLE_PORT_OPEN=3D0 event and do not receive further data... Let's not trigger this disconnection/reset logic if the agent does not support VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL. Fixes: f626116f ("ui/vdagent: factor out clipboard peer registration") Signed-off-by: Marc-Andr=C3=A9 Lureau Reported-by: Lucas Kornicki Tested-by: Lucas Kornicki --- ui/vdagent.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/ui/vdagent.c b/ui/vdagent.c index ddb91e75c6..660686c9c0 100644 --- a/ui/vdagent.c +++ b/ui/vdagent.c @@ -316,6 +316,15 @@ static bool have_selection(VDAgentChardev *vd) return vd->caps & (1 << VD_AGENT_CAP_CLIPBOARD_SELECTION); } =20 +static bool have_clipboard_serial(VDAgentChardev *vd) +{ +#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) + return vd->caps & (1 << VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL); +#else + return false; +#endif +} + static uint32_t type_qemu_to_vdagent(enum QemuClipboardType type) { switch (type) { @@ -345,8 +354,7 @@ static void vdagent_send_clipboard_grab(VDAgentChardev = *vd, return; } =20 -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) - if (vd->caps & (1 << VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL)) { + if (have_clipboard_serial(vd)) { if (!info->has_serial) { /* client should win */ info->serial =3D vd->last_serial[info->selection]++; @@ -356,7 +364,6 @@ static void vdagent_send_clipboard_grab(VDAgentChardev = *vd, data++; msg->size +=3D sizeof(uint32_t); } -#endif =20 for (q =3D 0; q < QEMU_CLIPBOARD_TYPE__COUNT; q++) { type =3D type_qemu_to_vdagent(q); @@ -464,6 +471,9 @@ static void vdagent_clipboard_reset_serial(VDAgentChard= ev *vd) { Chardev *chr =3D CHARDEV(vd); =20 + if (!have_clipboard_serial(vd)) { + return; + } /* reopen the agent connection to reset the serial state */ qemu_chr_be_event(chr, CHR_EVENT_CLOSED); /* OPENED again after the guest disconnected, see set_fe_open */ @@ -518,8 +528,7 @@ static void vdagent_clipboard_recv_grab(VDAgentChardev = *vd, uint8_t s, uint32_t =20 trace_vdagent_cb_grab_selection(GET_NAME(sel_name, s)); info =3D qemu_clipboard_info_new(&vd->cbpeer, s); -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) - if (vd->caps & (1 << VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL)) { + if (have_clipboard_serial(vd)) { if (size < sizeof(uint32_t)) { /* this shouldn't happen! */ return; @@ -537,7 +546,6 @@ static void vdagent_clipboard_recv_grab(VDAgentChardev = *vd, uint8_t s, uint32_t data +=3D sizeof(uint32_t); size -=3D sizeof(uint32_t); } -#endif if (size > sizeof(uint32_t) * 10) { /* * spice has 6 types as of 2021. Limiting to 10 entries --=20 2.51.0