From nobody Wed Dec 17 05:29:55 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=smartx.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1744079459445269.9536595453751; Mon, 7 Apr 2025 19:30:59 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 8684A161B; Mon, 7 Apr 2025 22:30:58 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 8AD4416DE; Mon, 7 Apr 2025 22:30:20 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 83ADC1085; Mon, 7 Apr 2025 22:30:16 -0400 (EDT) Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8AEE91619 for ; Mon, 7 Apr 2025 22:30:15 -0400 (EDT) Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-224100e9a5cso52221215ad.2 for ; Mon, 07 Apr 2025 19:30:15 -0700 (PDT) Received: from Hyman-Dev-Euler.zelin.local (n058152022078.netvigator.com. [58.152.22.78]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-229785ad899sm89023155ad.14.2025.04.07.19.30.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 19:30:14 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20230601.gappssmtp.com; s=20230601; t=1744079414; x=1744684214; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bQsssBqR5oZoGPzcTwlfqDlaUrB7sbGsEDAyR72FbGw=; b=J2mEyzZx7Z58kti+A4/EbK22LS0O3JZ6uO6QwT0p3B8ZQUZrDToTyx87SSVvHiCjb6 n2Bnj56oyppX4yvl5S5Aoz66XLpggt/tScRGbWis6j8V3ee1OVjSL9QmiKcCHkdFNdxs rrRut5MsAOtUHMJ7hwUlziA5wlxZTjXPVoyOGQ+LILRw7mD/qzwIfU76Oljiik0PG2g5 M5cNsdBPP3QxwMz8lcpZ4mkzqck/5riOcVSiByjN0nroSKjShHHpPv4P3APMPPKEHxGF i2FSV9p7CvJVzgyxvYexUD0+kgLeVlK0hkdl6Tm7Y62akmhAGoFG60AwE4eV6wJC7vBv gIzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744079414; x=1744684214; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bQsssBqR5oZoGPzcTwlfqDlaUrB7sbGsEDAyR72FbGw=; b=S2sWkn/bTDZc0XYBWH2EWkrjC47AkNDP7vvt15QAlChv6ZyjGXqkgQH0qEu/b4dzx9 4F5MlmiexIl+kRQX5Sbn6Pbyo4my+VJ65XdaLGQMpXAgaSOCFGZpBZPp19HmbrEqQDaP J30kAsTrKBsvuCY35+FCOVbJx6TMXh2CXDmfvzvTGEIrepAvzDjXf5kR1OUc9W0Sc+x4 +T+J9Q6kQ9EBomy8erJO3b4HduMcLkED8v289qAHPTQYIaNArAG8n4rRldMC7lQYnXZs s8Y3VoyUcRFk99RumJUZoHTabI7T3AcwV63TXRuo1Ezz3/Z8e7Qsaz/11Y2KeFXUAaRj nsxA== X-Gm-Message-State: AOJu0YwKrDadmbe7XMjyAy9o5cIpsqhT+CD1DuiIr4vnGqcywqMYYKCe 1GTrxzNy2fVCvESRslsSoeb2whZfEUAE8HVKD2fRUjS3y1b8rlyKSGOcZavyw8S9SPkXxOqQXCO t1s8IzAyx X-Gm-Gg: ASbGncuAjbnI0T1fHBsYHLS362vWlB6okI1uamKWjSHO6c+woLv3vsOi/pQ7NORDsBI 9oy6sFEFBioxFcieYVzI38pE8JrklpFWaZ/eTRPlFj5tYHVYqepx8L+TEWQPb/lotlrSmjFve5N mj4YqtLrhwvkHKFY1+hjSgLk1df6BM6c270JUZBqEnxH0r5QCpmvHl3yN+iSkZS3pv0Aj7Iy5Ze sEIPHs99cq3un+6HC8J8UzjNlkMZMCS+AAPohSMGQoiKvybTJusuGeZrVjD8XUXTfThNWCAKy7Q YF0PrzCCSzYKkiltnUvIcD2+5LDNX80CPdj4ecWDmZGwNVqVrTCJ9hx25TISd7tZU4XfqgJUVTF qFDSBsaim9DHSb6pNfTeupxtVPxdBnV/HSSRy8v2nAabdfVlNwAneRJfz2jivTA== X-Google-Smtp-Source: AGHT+IEddSFExuhvvwDJ1Xp8ufV1DGbw2upbzdFaZZvADr5seJAxgqjpFpr5LuL3TgVMk74W+PfX8Q== X-Received: by 2002:a17:903:19d0:b0:220:e63c:5aff with SMTP id d9443c01a7336-22a8a8e3fa7mr182365485ad.47.1744079414382; Mon, 07 Apr 2025 19:30:14 -0700 (PDT) From: yong.huang@smartx.com To: devel@lists.libvirt.org Subject: [PATCH v1 1/1] rpc: Add the retry argument for virNetTLSSession{Read,Write} Date: Tue, 8 Apr 2025 10:27:51 +0800 Message-Id: <757626eb77d6c592bc1037b47874fe8223e43959.1744076543.git.yong.huang@smartx.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 4MDY2555FHZO3MYQRWJB7WAGDRY7GSNB X-Message-ID-Hash: 4MDY2555FHZO3MYQRWJB7WAGDRY7GSNB X-MailFrom: yong.huang@smartx.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: yong.huang@smartx.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1744079461923019100 Content-Type: text/plain; charset="utf-8" From: Hyman Huang As advised by the GNU TLS, the caller should attempt again if the gnutls_record_{recv,send} return EAGAIN or EINTR; check the following link to view the details: https://www.gnutls.org/manual/html_node/Data-transfer-and-termination.html Add the retry parameter for virNetTLSSession{Read,Write} functions in accordance with this guideline. This prevents the upper application from encountering the following error message when it calls the virConnectOpenAuth API: Unable to read TLS confirmation: Resource temporarily unavailable Signed-off-by: Hyman Huang --- src/rpc/virnetclient.c | 2 +- src/rpc/virnetsocket.c | 4 ++-- src/rpc/virnettlscontext.c | 28 ++++++++++++++++++++++++++-- src/rpc/virnettlscontext.h | 6 ++++-- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 92933220e2..5340db4211 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -1003,7 +1003,7 @@ int virNetClientSetTLSSession(virNetClient *client, ignore_value(pthread_sigmask(SIG_SETMASK, &oldmask, NULL)); #endif /* !WIN32 */ =20 - len =3D virNetTLSSessionRead(client->tls, buf, 1); + len =3D virNetTLSSessionRead(client->tls, buf, 1, true); if (len < 0 && errno !=3D ENOMSG) { virReportSystemError(errno, "%s", _("Unable to read TLS confirmation")); diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index e8fc2d5f7d..6774dd4a4b 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -1739,7 +1739,7 @@ static ssize_t virNetSocketReadWire(virNetSocket *soc= k, char *buf, size_t len) if (sock->tlsSession && virNetTLSSessionGetHandshakeStatus(sock->tlsSession) =3D=3D VIR_NET_TLS_HANDSHAKE_COMPLETE) { - ret =3D virNetTLSSessionRead(sock->tlsSession, buf, len); + ret =3D virNetTLSSessionRead(sock->tlsSession, buf, len, false); } else { ret =3D read(sock->fd, buf, len); } @@ -1807,7 +1807,7 @@ static ssize_t virNetSocketWriteWire(virNetSocket *so= ck, const char *buf, size_t if (sock->tlsSession && virNetTLSSessionGetHandshakeStatus(sock->tlsSession) =3D=3D VIR_NET_TLS_HANDSHAKE_COMPLETE) { - ret =3D virNetTLSSessionWrite(sock->tlsSession, buf, len); + ret =3D virNetTLSSessionWrite(sock->tlsSession, buf, len, false); } else { ret =3D write(sock->fd, buf, len); /* sc_avoid_write */ } diff --git a/src/rpc/virnettlscontext.c b/src/rpc/virnettlscontext.c index e8023133b4..92d909c0b7 100644 --- a/src/rpc/virnettlscontext.c +++ b/src/rpc/virnettlscontext.c @@ -679,16 +679,28 @@ void virNetTLSSessionSetIOCallbacks(virNetTLSSession = *sess, =20 =20 ssize_t virNetTLSSessionWrite(virNetTLSSession *sess, - const char *buf, size_t len) + const char *buf, size_t len, + bool retry) { ssize_t ret; =20 + rewrite: virObjectLock(sess); ret =3D gnutls_record_send(sess->session, buf, len); =20 if (ret >=3D 0) goto cleanup; =20 + if (retry && (ret =3D=3D GNUTLS_E_AGAIN || ret =3D=3D GNUTLS_E_INTERRU= PTED)) { + /* + * GNU TLS advises calling the function again to obtain the data i= f EAGAIN is returned. + * See reference: https://www.gnutls.org/manual/html_node/Data-tra= nsfer-and-termination.html + * */ + VIR_DEBUG("Try writing data from the TLS session again"); + virObjectUnlock(sess); + goto rewrite; + } + switch (ret) { case GNUTLS_E_AGAIN: errno =3D EAGAIN; @@ -712,16 +724,28 @@ ssize_t virNetTLSSessionWrite(virNetTLSSession *sess, } =20 ssize_t virNetTLSSessionRead(virNetTLSSession *sess, - char *buf, size_t len) + char *buf, size_t len, + bool retry) { ssize_t ret; =20 + reread: virObjectLock(sess); ret =3D gnutls_record_recv(sess->session, buf, len); =20 if (ret >=3D 0) goto cleanup; =20 + if (retry && (ret =3D=3D GNUTLS_E_AGAIN || ret =3D=3D GNUTLS_E_INTERRU= PTED)) { + /* + * GNU TLS advises calling the function again to obtain the data i= f EAGAIN is returned. + * See reference: https://www.gnutls.org/manual/html_node/Data-tra= nsfer-and-termination.html + * */ + VIR_DEBUG("Try reading data from the TLS session again"); + virObjectUnlock(sess); + goto reread; + } + switch (ret) { case GNUTLS_E_AGAIN: errno =3D EAGAIN; diff --git a/src/rpc/virnettlscontext.h b/src/rpc/virnettlscontext.h index 11c954ce4b..da26d7836b 100644 --- a/src/rpc/virnettlscontext.h +++ b/src/rpc/virnettlscontext.h @@ -81,9 +81,11 @@ void virNetTLSSessionSetIOCallbacks(virNetTLSSession *se= ss, void *opaque); =20 ssize_t virNetTLSSessionWrite(virNetTLSSession *sess, - const char *buf, size_t len); + const char *buf, size_t len, + bool retry); ssize_t virNetTLSSessionRead(virNetTLSSession *sess, - char *buf, size_t len); + char *buf, size_t len, + bool retry); =20 int virNetTLSSessionHandshake(virNetTLSSession *sess); =20 --=20 2.27.0