From patchwork Thu Jan 30 10:08:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maciej S. Szmigiero" X-Patchwork-Id: 13954446 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E43CFC02190 for ; Thu, 30 Jan 2025 10:12:23 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tdRUi-0002Ef-61; Thu, 30 Jan 2025 05:09:56 -0500 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 1tdRUg-0002EU-5w for qemu-devel@nongnu.org; Thu, 30 Jan 2025 05:09:54 -0500 Received: from vps-ovh.mhejs.net ([145.239.82.108]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tdRUe-00073x-MQ for qemu-devel@nongnu.org; Thu, 30 Jan 2025 05:09:53 -0500 Received: from MUA by vps-ovh.mhejs.net with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98) (envelope-from ) id 1tdRUZ-00000006TxG-04Ei; Thu, 30 Jan 2025 11:09:47 +0100 From: "Maciej S. Szmigiero" To: Peter Xu , Fabiano Rosas Cc: Alex Williamson , =?utf-8?q?C=C3=A9dric_Le_G?= =?utf-8?q?oater?= , Eric Blake , Markus Armbruster , =?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= , Avihai Horon , Joao Martins , qemu-devel@nongnu.org Subject: [PATCH v4 07/33] io: tls: Allow terminating the TLS session gracefully with EOF Date: Thu, 30 Jan 2025 11:08:28 +0100 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: MIME-Version: 1.0 Received-SPF: pass client-ip=145.239.82.108; envelope-from=mhej@vps-ovh.mhejs.net; helo=vps-ovh.mhejs.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.037, 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: "Maciej S. Szmigiero" Currently, hitting EOF on receive without sender terminating the TLS session properly causes the TLS channel to return an error (unless the channel was already shut down for read). Add an optional setting whether we instead just return EOF in that case. This possibility will be soon used by the migration multifd code. Signed-off-by: Maciej S. Szmigiero --- include/io/channel-tls.h | 11 +++++++++++ io/channel-tls.c | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h index 26c67f17e2d3..8552c0d0266e 100644 --- a/include/io/channel-tls.h +++ b/include/io/channel-tls.h @@ -49,6 +49,7 @@ struct QIOChannelTLS { QCryptoTLSSession *session; QIOChannelShutdown shutdown; guint hs_ioc_tag; + bool premature_eof_okay; }; /** @@ -143,4 +144,14 @@ void qio_channel_tls_handshake(QIOChannelTLS *ioc, QCryptoTLSSession * qio_channel_tls_get_session(QIOChannelTLS *ioc); +/** + * qio_channel_tls_set_premature_eof_okay: + * @ioc: the TLS channel object + * + * Sets whether receiving an EOF without terminating the TLS session properly + * by used the other side is considered okay or an error (the + * default behaviour). + */ +void qio_channel_tls_set_premature_eof_okay(QIOChannelTLS *ioc, bool enabled); + #endif /* QIO_CHANNEL_TLS_H */ diff --git a/io/channel-tls.c b/io/channel-tls.c index aab630e5ae32..1079d6d10de1 100644 --- a/io/channel-tls.c +++ b/io/channel-tls.c @@ -147,6 +147,11 @@ qio_channel_tls_new_client(QIOChannel *master, return NULL; } +void qio_channel_tls_set_premature_eof_okay(QIOChannelTLS *ioc, bool enabled) +{ + ioc->premature_eof_okay = enabled; +} + struct QIOChannelTLSData { QIOTask *task; GMainContext *context; @@ -279,6 +284,7 @@ static ssize_t qio_channel_tls_readv(QIOChannel *ioc, tioc->session, iov[i].iov_base, iov[i].iov_len, + tioc->premature_eof_okay || qatomic_load_acquire(&tioc->shutdown) & QIO_CHANNEL_SHUTDOWN_READ, errp); if (ret == QCRYPTO_TLS_SESSION_ERR_BLOCK) {