* [PULL 0/7] Migration patches for 2025-07-22
@ 2025-07-22 23:42 Fabiano Rosas
2025-07-22 23:42 ` [PULL 1/7] migration: HMP: Fix possible out-of-bounds access Fabiano Rosas
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu
Hi, checkpatch.pl complains about patch 4/7 due to the generated
meson-buildoptions.sh file. Please ignore.
The following changes since commit 9e601684dc24a521bb1d23215a63e5c6e79ea0bb:
Update version for the v10.1.0-rc0 release (2025-07-22 15:48:48 -0400)
are available in the Git repository at:
https://gitlab.com/farosas/qemu.git tags/migration-20250722-pull-request
for you to fetch changes up to 0db6f798024ea6f57ecf2020209b761b50a01d71:
crypto: add tracing & warning about GNUTLS countermeasures (2025-07-22 19:39:30 -0300)
----------------------------------------------------------------
Migration pull request
- Fixes to postcopy blocktime latency display code
- Fix to QMP error message (not)shown when postcopy fails
- Workaround to a GNUTLS bug that crashes QEMU
----------------------------------------------------------------
Daniel P. Berrangé (5):
migration: show error message when postcopy fails
crypto: implement workaround for GNUTLS thread safety problems
io: add support for activating TLS thread safety workaround
migration: activate TLS thread safety workaround
crypto: add tracing & warning about GNUTLS countermeasures
Fabiano Rosas (2):
migration: HMP: Fix possible out-of-bounds access
migration: HMP: Fix postcopy latency distribution label
crypto/tlssession.c | 103 ++++++++++++++++++++++++++++++++-
crypto/trace-events | 2 +
include/crypto/tlssession.h | 14 +++++
include/io/channel.h | 1 +
io/channel-tls.c | 5 ++
meson.build | 9 +++
meson_options.txt | 2 +
migration/migration-hmp-cmds.c | 10 ++--
migration/tls.c | 9 +++
scripts/meson-buildoptions.sh | 5 ++
10 files changed, 152 insertions(+), 8 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PULL 1/7] migration: HMP: Fix possible out-of-bounds access
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 2/7] migration: HMP: Fix postcopy latency distribution label Fabiano Rosas
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Peter Maydell, Philippe Mathieu-Daudé
Coverity has caught a bug in the formatting of time intervals for
postcopy latency distribution display in 'info migrate'.
While bounds checking the labels array, sizeof is incorrectly being
used. ARRAY_SIZE is the correct form of obtaining the size of an
array.
Fixes: 3345fb3b6d ("migration/postcopy: Add latency distribution report for blocktime")
Resolves: Coverity CID 1612248
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20250716182648.30202-2-farosas@suse.de
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration-hmp-cmds.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index cef5608210..bb954881d7 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -57,11 +57,9 @@ static const gchar *format_time_str(uint64_t us)
const char *units[] = {"us", "ms", "sec"};
int index = 0;
- while (us > 1000) {
+ while (us > 1000 && index + 1 < ARRAY_SIZE(units)) {
us /= 1000;
- if (++index >= (sizeof(units) - 1)) {
- break;
- }
+ index++;
}
return g_strdup_printf("%"PRIu64" %s", us, units[index]);
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 2/7] migration: HMP: Fix postcopy latency distribution label
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
2025-07-22 23:42 ` [PULL 1/7] migration: HMP: Fix possible out-of-bounds access Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 3/7] migration: show error message when postcopy fails Fabiano Rosas
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Prasad Pandit, Philippe Mathieu-Daudé
Fix the loop condition to avoid having a label with "1000 us" instead
of "1 ms".
Reported-by: Prasad Pandit <ppandit@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20250716182648.30202-3-farosas@suse.de
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration-hmp-cmds.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index bb954881d7..a8b879c9d6 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -57,7 +57,7 @@ static const gchar *format_time_str(uint64_t us)
const char *units[] = {"us", "ms", "sec"};
int index = 0;
- while (us > 1000 && index + 1 < ARRAY_SIZE(units)) {
+ while (us >= 1000 && index + 1 < ARRAY_SIZE(units)) {
us /= 1000;
index++;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 3/7] migration: show error message when postcopy fails
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
2025-07-22 23:42 ` [PULL 1/7] migration: HMP: Fix possible out-of-bounds access Fabiano Rosas
2025-07-22 23:42 ` [PULL 2/7] migration: HMP: Fix postcopy latency distribution label Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 4/7] crypto: implement workaround for GNUTLS thread safety problems Fabiano Rosas
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The 'info migrate' command only shows the error message when the
migration state is 'failed'. When postcopy is used, however,
the 'postcopy-paused' state is used instead of 'failed', so we
must show the error message there too.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/qemu-devel/20250721133913.2914669-1-berrange@redhat.com
[line break to satisfy checkpatch]
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration-hmp-cmds.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index a8b879c9d6..0fc21f0647 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -151,7 +151,9 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
if (info->has_status) {
monitor_printf(mon, "Status: \t\t%s",
MigrationStatus_str(info->status));
- if (info->status == MIGRATION_STATUS_FAILED && info->error_desc) {
+ if ((info->status == MIGRATION_STATUS_FAILED ||
+ info->status == MIGRATION_STATUS_POSTCOPY_PAUSED) &&
+ info->error_desc) {
monitor_printf(mon, " (%s)\n", info->error_desc);
} else {
monitor_printf(mon, "\n");
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 4/7] crypto: implement workaround for GNUTLS thread safety problems
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
` (2 preceding siblings ...)
2025-07-22 23:42 ` [PULL 3/7] migration: show error message when postcopy fails Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 5/7] io: add support for activating TLS thread safety workaround Fabiano Rosas
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
When TLS 1.3 is negotiated on a TLS session, GNUTLS will perform
automatic rekeying of the session after 16 million records. This
is done for all algorithms except CHACHA20_POLY1305 which does
not require rekeying.
Unfortunately the rekeying breaks GNUTLS' promise that it is safe
to use a gnutls_session_t object concurrently from multiple threads
if they are exclusively calling gnutls_record_send/recv.
This patch implements a workaround for QEMU that adds a mutex lock
around any gnutls_record_send/recv call to serialize execution
within GNUTLS code. When GNUTLS calls into the push/pull functions
we can release the lock so the OS level I/O calls can at least
have some parallelism.
The big downside of this is that the actual encryption/decryption
code is fully serialized, which will halve performance of that
cipher operations if two threads are contending.
The workaround is not enabled by default, since most use of GNUTLS
in QEMU does not tickle the problem, only non-multifd migration
with a return path open is affected. Fortunately the migration
code also won't trigger the halving of performance, since only
the outbound channel diretion needs to sustain high data rates,
the inbound direction is low volume.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/qemu-devel/20250718150514.2635338-2-berrange@redhat.com
[add stub for qcrypto_tls_session_require_thread_safety; fix unused var]
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
crypto/tlssession.c | 92 +++++++++++++++++++++++++++++++++--
include/crypto/tlssession.h | 14 ++++++
meson.build | 9 ++++
meson_options.txt | 2 +
scripts/meson-buildoptions.sh | 5 ++
5 files changed, 119 insertions(+), 3 deletions(-)
diff --git a/crypto/tlssession.c b/crypto/tlssession.c
index 6d8f8df623..baef878fa0 100644
--- a/crypto/tlssession.c
+++ b/crypto/tlssession.c
@@ -19,6 +19,7 @@
*/
#include "qemu/osdep.h"
+#include "qemu/thread.h"
#include "crypto/tlssession.h"
#include "crypto/tlscredsanon.h"
#include "crypto/tlscredspsk.h"
@@ -51,6 +52,14 @@ struct QCryptoTLSSession {
*/
Error *rerr;
Error *werr;
+
+ /*
+ * Used to protect against broken GNUTLS thread safety
+ * https://gitlab.com/gnutls/gnutls/-/issues/1717
+ */
+ bool requireThreadSafety;
+ bool lockEnabled;
+ QemuMutex lock;
};
@@ -69,6 +78,7 @@ qcrypto_tls_session_free(QCryptoTLSSession *session)
g_free(session->peername);
g_free(session->authzid);
object_unref(OBJECT(session->creds));
+ qemu_mutex_destroy(&session->lock);
g_free(session);
}
@@ -84,10 +94,19 @@ qcrypto_tls_session_push(void *opaque, const void *buf, size_t len)
return -1;
};
+ if (session->lockEnabled) {
+ qemu_mutex_unlock(&session->lock);
+ }
+
error_free(session->werr);
session->werr = NULL;
ret = session->writeFunc(buf, len, session->opaque, &session->werr);
+
+ if (session->lockEnabled) {
+ qemu_mutex_lock(&session->lock);
+ }
+
if (ret == QCRYPTO_TLS_SESSION_ERR_BLOCK) {
errno = EAGAIN;
return -1;
@@ -114,7 +133,16 @@ qcrypto_tls_session_pull(void *opaque, void *buf, size_t len)
error_free(session->rerr);
session->rerr = NULL;
+ if (session->lockEnabled) {
+ qemu_mutex_unlock(&session->lock);
+ }
+
ret = session->readFunc(buf, len, session->opaque, &session->rerr);
+
+ if (session->lockEnabled) {
+ qemu_mutex_lock(&session->lock);
+ }
+
if (ret == QCRYPTO_TLS_SESSION_ERR_BLOCK) {
errno = EAGAIN;
return -1;
@@ -153,6 +181,8 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
session->creds = creds;
object_ref(OBJECT(creds));
+ qemu_mutex_init(&session->lock);
+
if (creds->endpoint != endpoint) {
error_setg(errp, "Credentials endpoint doesn't match session");
goto error;
@@ -289,6 +319,11 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
return NULL;
}
+void qcrypto_tls_session_require_thread_safety(QCryptoTLSSession *sess)
+{
+ sess->requireThreadSafety = true;
+}
+
static int
qcrypto_tls_session_check_certificate(QCryptoTLSSession *session,
Error **errp)
@@ -480,7 +515,17 @@ qcrypto_tls_session_write(QCryptoTLSSession *session,
size_t len,
Error **errp)
{
- ssize_t ret = gnutls_record_send(session->handle, buf, len);
+ ssize_t ret;
+
+ if (session->lockEnabled) {
+ qemu_mutex_lock(&session->lock);
+ }
+
+ ret = gnutls_record_send(session->handle, buf, len);
+
+ if (session->lockEnabled) {
+ qemu_mutex_unlock(&session->lock);
+ }
if (ret < 0) {
if (ret == GNUTLS_E_AGAIN) {
@@ -509,7 +554,17 @@ qcrypto_tls_session_read(QCryptoTLSSession *session,
bool gracefulTermination,
Error **errp)
{
- ssize_t ret = gnutls_record_recv(session->handle, buf, len);
+ ssize_t ret;
+
+ if (session->lockEnabled) {
+ qemu_mutex_lock(&session->lock);
+ }
+
+ ret = gnutls_record_recv(session->handle, buf, len);
+
+ if (session->lockEnabled) {
+ qemu_mutex_unlock(&session->lock);
+ }
if (ret < 0) {
if (ret == GNUTLS_E_AGAIN) {
@@ -545,8 +600,29 @@ int
qcrypto_tls_session_handshake(QCryptoTLSSession *session,
Error **errp)
{
- int ret = gnutls_handshake(session->handle);
+ int ret;
+ ret = gnutls_handshake(session->handle);
+
if (!ret) {
+#ifdef CONFIG_GNUTLS_BUG1717_WORKAROUND
+ gnutls_cipher_algorithm_t cipher =
+ gnutls_cipher_get(session->handle);
+
+ /*
+ * Any use of rekeying in TLS 1.3 is unsafe for
+ * a gnutls with bug 1717, however, we know that
+ * QEMU won't initiate manual rekeying. Thus we
+ * only have to protect against automatic rekeying
+ * which doesn't trigger with CHACHA20
+ */
+ if (session->requireThreadSafety &&
+ gnutls_protocol_get_version(session->handle) ==
+ GNUTLS_TLS1_3 &&
+ cipher != GNUTLS_CIPHER_CHACHA20_POLY1305) {
+ session->lockEnabled = true;
+ }
+#endif
+
session->handshakeComplete = true;
return QCRYPTO_TLS_HANDSHAKE_COMPLETE;
}
@@ -584,8 +660,15 @@ qcrypto_tls_session_bye(QCryptoTLSSession *session, Error **errp)
return 0;
}
+ if (session->lockEnabled) {
+ qemu_mutex_lock(&session->lock);
+ }
ret = gnutls_bye(session->handle, GNUTLS_SHUT_WR);
+ if (session->lockEnabled) {
+ qemu_mutex_unlock(&session->lock);
+ }
+
if (!ret) {
return QCRYPTO_TLS_BYE_COMPLETE;
}
@@ -651,6 +734,9 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds G_GNUC_UNUSED,
return NULL;
}
+void qcrypto_tls_session_require_thread_safety(QCryptoTLSSession *sess)
+{
+}
void
qcrypto_tls_session_free(QCryptoTLSSession *sess G_GNUC_UNUSED)
diff --git a/include/crypto/tlssession.h b/include/crypto/tlssession.h
index d77ae0d423..2f62ce2d67 100644
--- a/include/crypto/tlssession.h
+++ b/include/crypto/tlssession.h
@@ -165,6 +165,20 @@ void qcrypto_tls_session_free(QCryptoTLSSession *sess);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoTLSSession, qcrypto_tls_session_free)
+/**
+ * qcrypto_tls_session_require_thread_safety:
+ * @sess: the TLS session object
+ *
+ * Mark that this TLS session will require thread safety
+ * for concurrent I/O in both directions. This must be
+ * called before the handshake is performed.
+ *
+ * This will activate a workaround for GNUTLS thread
+ * safety issues, where appropriate for the negotiated
+ * TLS session parameters.
+ */
+void qcrypto_tls_session_require_thread_safety(QCryptoTLSSession *sess);
+
/**
* qcrypto_tls_session_check_credentials:
* @sess: the TLS session object
diff --git a/meson.build b/meson.build
index c2bc3eeedc..e53cd5b413 100644
--- a/meson.build
+++ b/meson.build
@@ -1809,6 +1809,7 @@ endif
gnutls = not_found
gnutls_crypto = not_found
+gnutls_bug1717_workaround = false
if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
# For general TLS support our min gnutls matches
# that implied by our platform support matrix
@@ -1834,6 +1835,12 @@ if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_syste
method: 'pkg-config',
required: get_option('gnutls'))
endif
+
+ if gnutls.found() and not get_option('gnutls-bug1717-workaround').disabled()
+ # XXX: when bug 1717 is resolved, add logic to probe for
+ # the GNUTLS fixed version number to handle the 'auto' case
+ gnutls_bug1717_workaround = true
+ endif
endif
# We prefer use of gnutls for crypto, unless the options
@@ -2585,6 +2592,7 @@ config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
config_host_data.set('CONFIG_GETTID', has_gettid)
config_host_data.set('CONFIG_GNUTLS', gnutls.found())
config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
+config_host_data.set('CONFIG_GNUTLS_BUG1717_WORKAROUND', gnutls_bug1717_workaround)
config_host_data.set('CONFIG_TASN1', tasn1.found())
config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
config_host_data.set('CONFIG_NETTLE', nettle.found())
@@ -4869,6 +4877,7 @@ summary_info += {'TLS priority': get_option('tls_priority')}
summary_info += {'GNUTLS support': gnutls}
if gnutls.found()
summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
+ summary_info += {' GNUTLS bug 1717 workaround': gnutls_bug1717_workaround }
endif
summary_info += {'libgcrypt': gcrypt}
summary_info += {'nettle': nettle}
diff --git a/meson_options.txt b/meson_options.txt
index fff1521e58..dd33530750 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -174,6 +174,8 @@ option('libcbor', type : 'feature', value : 'auto',
description: 'libcbor support')
option('gnutls', type : 'feature', value : 'auto',
description: 'GNUTLS cryptography support')
+option('gnutls-bug1717-workaround', type: 'feature', value : 'auto',
+ description: 'GNUTLS workaround for https://gitlab.com/gnutls/gnutls/-/issues/1717')
option('nettle', type : 'feature', value : 'auto',
description: 'nettle cryptography support')
option('gcrypt', type : 'feature', value : 'auto',
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 0ebe6bc52a..d559e260ed 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -123,6 +123,9 @@ meson_options_help() {
printf "%s\n" ' gio use libgio for D-Bus support'
printf "%s\n" ' glusterfs Glusterfs block device driver'
printf "%s\n" ' gnutls GNUTLS cryptography support'
+ printf "%s\n" ' gnutls-bug1717-workaround'
+ printf "%s\n" ' GNUTLS workaround for'
+ printf "%s\n" ' https://gitlab.com/gnutls/gnutls/-/issues/1717'
printf "%s\n" ' gtk GTK+ user interface'
printf "%s\n" ' gtk-clipboard clipboard support for the gtk UI (EXPERIMENTAL, MAY HANG)'
printf "%s\n" ' guest-agent Build QEMU Guest Agent'
@@ -331,6 +334,8 @@ _meson_option_parse() {
--disable-glusterfs) printf "%s" -Dglusterfs=disabled ;;
--enable-gnutls) printf "%s" -Dgnutls=enabled ;;
--disable-gnutls) printf "%s" -Dgnutls=disabled ;;
+ --enable-gnutls-bug1717-workaround) printf "%s" -Dgnutls-bug1717-workaround=enabled ;;
+ --disable-gnutls-bug1717-workaround) printf "%s" -Dgnutls-bug1717-workaround=disabled ;;
--enable-gtk) printf "%s" -Dgtk=enabled ;;
--disable-gtk) printf "%s" -Dgtk=disabled ;;
--enable-gtk-clipboard) printf "%s" -Dgtk_clipboard=enabled ;;
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 5/7] io: add support for activating TLS thread safety workaround
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
` (3 preceding siblings ...)
2025-07-22 23:42 ` [PULL 4/7] crypto: implement workaround for GNUTLS thread safety problems Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 6/7] migration: activate " Fabiano Rosas
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
Add a QIO_CHANNEL_FEATURE_CONCURRENT_IO feature flag.
If this is set on a QIOChannelTLS session object, the TLS
session will be marked as requiring thread safety, which
will activate the workaround for GNUTLS bug 1717 if needed.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/qemu-devel/20250718150514.2635338-3-berrange@redhat.com
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
include/io/channel.h | 1 +
io/channel-tls.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/io/channel.h b/include/io/channel.h
index 62b657109c..234e5db70d 100644
--- a/include/io/channel.h
+++ b/include/io/channel.h
@@ -46,6 +46,7 @@ enum QIOChannelFeature {
QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY,
QIO_CHANNEL_FEATURE_READ_MSG_PEEK,
QIO_CHANNEL_FEATURE_SEEKABLE,
+ QIO_CHANNEL_FEATURE_CONCURRENT_IO,
};
diff --git a/io/channel-tls.c b/io/channel-tls.c
index db2ac1deae..a8248a9216 100644
--- a/io/channel-tls.c
+++ b/io/channel-tls.c
@@ -241,6 +241,11 @@ void qio_channel_tls_handshake(QIOChannelTLS *ioc,
{
QIOTask *task;
+ if (qio_channel_has_feature(QIO_CHANNEL(ioc),
+ QIO_CHANNEL_FEATURE_CONCURRENT_IO)) {
+ qcrypto_tls_session_require_thread_safety(ioc->session);
+ }
+
task = qio_task_new(OBJECT(ioc),
func, opaque, destroy);
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 6/7] migration: activate TLS thread safety workaround
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
` (4 preceding siblings ...)
2025-07-22 23:42 ` [PULL 5/7] io: add support for activating TLS thread safety workaround Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-22 23:42 ` [PULL 7/7] crypto: add tracing & warning about GNUTLS countermeasures Fabiano Rosas
2025-07-25 15:24 ` [PULL 0/7] Migration patches for 2025-07-22 Stefan Hajnoczi
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
When either the postcopy or return path capabilities are
enabled, the migration code will use the primary channel
for bidirectional I/O.
If either of those capabilities are enabled, the migration
code needs to mark the channel as expecting concurrent I/O
in order to activate the thread safety workarounds for
GNUTLS bug 1717
Closes: https://gitlab.com/qemu-project/qemu/-/issues/1937
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/qemu-devel/20250718150514.2635338-4-berrange@redhat.com
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/tls.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/migration/tls.c b/migration/tls.c
index 5cbf952383..284a6194b2 100644
--- a/migration/tls.c
+++ b/migration/tls.c
@@ -90,6 +90,10 @@ void migration_tls_channel_process_incoming(MigrationState *s,
trace_migration_tls_incoming_handshake_start();
qio_channel_set_name(QIO_CHANNEL(tioc), "migration-tls-incoming");
+ if (migrate_postcopy_ram() || migrate_return_path()) {
+ qio_channel_set_feature(QIO_CHANNEL(tioc),
+ QIO_CHANNEL_FEATURE_CONCURRENT_IO);
+ }
qio_channel_tls_handshake(tioc,
migration_tls_incoming_handshake,
NULL,
@@ -149,6 +153,11 @@ void migration_tls_channel_connect(MigrationState *s,
s->hostname = g_strdup(hostname);
trace_migration_tls_outgoing_handshake_start(hostname);
qio_channel_set_name(QIO_CHANNEL(tioc), "migration-tls-outgoing");
+
+ if (migrate_postcopy_ram() || migrate_return_path()) {
+ qio_channel_set_feature(QIO_CHANNEL(tioc),
+ QIO_CHANNEL_FEATURE_CONCURRENT_IO);
+ }
qio_channel_tls_handshake(tioc,
migration_tls_outgoing_handshake,
s,
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PULL 7/7] crypto: add tracing & warning about GNUTLS countermeasures
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
` (5 preceding siblings ...)
2025-07-22 23:42 ` [PULL 6/7] migration: activate " Fabiano Rosas
@ 2025-07-22 23:42 ` Fabiano Rosas
2025-07-25 15:24 ` [PULL 0/7] Migration patches for 2025-07-22 Stefan Hajnoczi
7 siblings, 0 replies; 9+ messages in thread
From: Fabiano Rosas @ 2025-07-22 23:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
We want some visibility on stderr when the GNUTLS thread
safety countermeasures are activated, to encourage people
to get the real fix deployed (once it exists). Some trace
points will also help if we see any further wierd crash
scenario we've not anticipated.
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/qemu-devel/20250718150514.2635338-5-berrange@redhat.com
[add missing include]
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
crypto/tlssession.c | 11 +++++++++++
crypto/trace-events | 2 ++
2 files changed, 13 insertions(+)
diff --git a/crypto/tlssession.c b/crypto/tlssession.c
index baef878fa0..86d407a142 100644
--- a/crypto/tlssession.c
+++ b/crypto/tlssession.c
@@ -19,6 +19,7 @@
*/
#include "qemu/osdep.h"
+#include "qemu/error-report.h"
#include "qemu/thread.h"
#include "crypto/tlssession.h"
#include "crypto/tlscredsanon.h"
@@ -615,10 +616,20 @@ qcrypto_tls_session_handshake(QCryptoTLSSession *session,
* only have to protect against automatic rekeying
* which doesn't trigger with CHACHA20
*/
+ trace_qcrypto_tls_session_parameters(
+ session,
+ session->requireThreadSafety,
+ gnutls_protocol_get_version(session->handle),
+ cipher);
+
if (session->requireThreadSafety &&
gnutls_protocol_get_version(session->handle) ==
GNUTLS_TLS1_3 &&
cipher != GNUTLS_CIPHER_CHACHA20_POLY1305) {
+ warn_report("WARNING: activating thread safety countermeasures "
+ "for potentially broken GNUTLS with TLS1.3 cipher=%d",
+ cipher);
+ trace_qcrypto_tls_session_bug1717_workaround(session);
session->lockEnabled = true;
}
#endif
diff --git a/crypto/trace-events b/crypto/trace-events
index bccd0bbf29..d0e33427fa 100644
--- a/crypto/trace-events
+++ b/crypto/trace-events
@@ -21,6 +21,8 @@ qcrypto_tls_creds_x509_load_cert_list(void *creds, const char *file) "TLS creds
# tlssession.c
qcrypto_tls_session_new(void *session, void *creds, const char *hostname, const char *authzid, int endpoint) "TLS session new session=%p creds=%p hostname=%s authzid=%s endpoint=%d"
qcrypto_tls_session_check_creds(void *session, const char *status) "TLS session check creds session=%p status=%s"
+qcrypto_tls_session_parameters(void *session, int threadSafety, int protocol, int cipher) "TLS session parameters session=%p threadSafety=%d protocol=%d cipher=%d"
+qcrypto_tls_session_bug1717_workaround(void *session) "TLS session bug1717 workaround session=%p"
# tls-cipher-suites.c
qcrypto_tls_cipher_suite_priority(const char *name) "priority: %s"
--
2.35.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PULL 0/7] Migration patches for 2025-07-22
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
` (6 preceding siblings ...)
2025-07-22 23:42 ` [PULL 7/7] crypto: add tracing & warning about GNUTLS countermeasures Fabiano Rosas
@ 2025-07-25 15:24 ` Stefan Hajnoczi
7 siblings, 0 replies; 9+ messages in thread
From: Stefan Hajnoczi @ 2025-07-25 15:24 UTC (permalink / raw)
To: Fabiano Rosas; +Cc: qemu-devel, Peter Xu
[-- Attachment #1: Type: text/plain, Size: 116 bytes --]
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/10.1 for any user-visible changes.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-07-25 15:26 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-22 23:42 [PULL 0/7] Migration patches for 2025-07-22 Fabiano Rosas
2025-07-22 23:42 ` [PULL 1/7] migration: HMP: Fix possible out-of-bounds access Fabiano Rosas
2025-07-22 23:42 ` [PULL 2/7] migration: HMP: Fix postcopy latency distribution label Fabiano Rosas
2025-07-22 23:42 ` [PULL 3/7] migration: show error message when postcopy fails Fabiano Rosas
2025-07-22 23:42 ` [PULL 4/7] crypto: implement workaround for GNUTLS thread safety problems Fabiano Rosas
2025-07-22 23:42 ` [PULL 5/7] io: add support for activating TLS thread safety workaround Fabiano Rosas
2025-07-22 23:42 ` [PULL 6/7] migration: activate " Fabiano Rosas
2025-07-22 23:42 ` [PULL 7/7] crypto: add tracing & warning about GNUTLS countermeasures Fabiano Rosas
2025-07-25 15:24 ` [PULL 0/7] Migration patches for 2025-07-22 Stefan Hajnoczi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).