- Apply io-remove-io-watch-if-TLS-channel-is-closed.patch
This commit is contained in:
parent
9cf15efa74
commit
77992c0d74
80
SOURCES/io-remove-io-watch-if-TLS-channel-is-closed.patch
Normal file
80
SOURCES/io-remove-io-watch-if-TLS-channel-is-closed.patch
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
From 10be627d2b5ec2d6b3dce045144aa739eef678b4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||||
|
Date: Tue, 20 Jun 2023 09:45:34 +0100
|
||||||
|
Subject: [PATCH] io: remove io watch if TLS channel is closed during handshake
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The TLS handshake make take some time to complete, during which time an
|
||||||
|
I/O watch might be registered with the main loop. If the owner of the
|
||||||
|
I/O channel invokes qio_channel_close() while the handshake is waiting
|
||||||
|
to continue the I/O watch must be removed. Failing to remove it will
|
||||||
|
later trigger the completion callback which the owner is not expecting
|
||||||
|
to receive. In the case of the VNC server, this results in a SEGV as
|
||||||
|
vnc_disconnect_start() tries to shutdown a client connection that is
|
||||||
|
already gone / NULL.
|
||||||
|
|
||||||
|
CVE-2023-3354
|
||||||
|
Reported-by: jiangyegen <jiangyegen@huawei.com>
|
||||||
|
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
---
|
||||||
|
include/io/channel-tls.h | 1 +
|
||||||
|
io/channel-tls.c | 18 ++++++++++++------
|
||||||
|
2 files changed, 13 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h
|
||||||
|
index 5672479e9eb6..26c67f17e2d3 100644
|
||||||
|
--- a/include/io/channel-tls.h
|
||||||
|
+++ b/include/io/channel-tls.h
|
||||||
|
@@ -48,6 +48,7 @@ struct QIOChannelTLS {
|
||||||
|
QIOChannel *master;
|
||||||
|
QCryptoTLSSession *session;
|
||||||
|
QIOChannelShutdown shutdown;
|
||||||
|
+ guint hs_ioc_tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/io/channel-tls.c b/io/channel-tls.c
|
||||||
|
index 9805dd0a3f64..847d5297c339 100644
|
||||||
|
--- a/io/channel-tls.c
|
||||||
|
+++ b/io/channel-tls.c
|
||||||
|
@@ -198,12 +198,13 @@ static void qio_channel_tls_handshake_task(QIOChannelTLS *ioc,
|
||||||
|
}
|
||||||
|
|
||||||
|
trace_qio_channel_tls_handshake_pending(ioc, status);
|
||||||
|
- qio_channel_add_watch_full(ioc->master,
|
||||||
|
- condition,
|
||||||
|
- qio_channel_tls_handshake_io,
|
||||||
|
- data,
|
||||||
|
- NULL,
|
||||||
|
- context);
|
||||||
|
+ ioc->hs_ioc_tag =
|
||||||
|
+ qio_channel_add_watch_full(ioc->master,
|
||||||
|
+ condition,
|
||||||
|
+ qio_channel_tls_handshake_io,
|
||||||
|
+ data,
|
||||||
|
+ NULL,
|
||||||
|
+ context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -218,6 +219,7 @@ static gboolean qio_channel_tls_handshake_io(QIOChannel *ioc,
|
||||||
|
QIOChannelTLS *tioc = QIO_CHANNEL_TLS(
|
||||||
|
qio_task_get_source(task));
|
||||||
|
|
||||||
|
+ tioc->hs_ioc_tag = 0;
|
||||||
|
g_free(data);
|
||||||
|
qio_channel_tls_handshake_task(tioc, task, context);
|
||||||
|
|
||||||
|
@@ -378,6 +380,10 @@ static int qio_channel_tls_close(QIOChannel *ioc,
|
||||||
|
{
|
||||||
|
QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
|
||||||
|
|
||||||
|
+ if (tioc->hs_ioc_tag) {
|
||||||
|
+ g_clear_handle_id(&tioc->hs_ioc_tag, g_source_remove);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return qio_channel_close(tioc->master, errp);
|
||||||
|
}
|
||||||
|
|
@ -83,7 +83,7 @@ Obsoletes: %1-rhev <= %{epoch}:%{version}-%{release}
|
|||||||
Summary: QEMU is a machine emulator and virtualizer
|
Summary: QEMU is a machine emulator and virtualizer
|
||||||
Name: qemu-kvm
|
Name: qemu-kvm
|
||||||
Version: 6.2.0
|
Version: 6.2.0
|
||||||
Release: 32%{?rcrel}%{?dist}
|
Release: 33%{?rcrel}%{?dist}.alma.1
|
||||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||||
Epoch: 15
|
Epoch: 15
|
||||||
License: GPLv2 and GPLv2+ and CC-BY
|
License: GPLv2 and GPLv2+ and CC-BY
|
||||||
@ -653,6 +653,11 @@ Patch256: kvm-dma-helpers-prevent-dma_blk_cb-vs-dma_aio_cancel-rac.patch
|
|||||||
# For bz#2090990 - qemu crash with error scsi_req_unref(SCSIRequest *): Assertion `req->refcount > 0' failed or scsi_dma_complete(void *, int): Assertion `r->req.aiocb != NULL' failed [8.7.0]
|
# For bz#2090990 - qemu crash with error scsi_req_unref(SCSIRequest *): Assertion `req->refcount > 0' failed or scsi_dma_complete(void *, int): Assertion `r->req.aiocb != NULL' failed [8.7.0]
|
||||||
Patch257: kvm-virtio-scsi-reset-SCSI-devices-from-main-loop-thread.patch
|
Patch257: kvm-virtio-scsi-reset-SCSI-devices-from-main-loop-thread.patch
|
||||||
|
|
||||||
|
# Patches were taken from upstream and backported to apply cleanly:
|
||||||
|
# https://github.com/qemu/qemu/commit/e62da98527fa35fe5f532cded01a33edf9fbe7b2.patch
|
||||||
|
Patch258: io-remove-io-watch-if-TLS-channel-is-closed.patch
|
||||||
|
|
||||||
|
|
||||||
BuildRequires: wget
|
BuildRequires: wget
|
||||||
BuildRequires: rpm-build
|
BuildRequires: rpm-build
|
||||||
BuildRequires: ninja-build
|
BuildRequires: ninja-build
|
||||||
@ -1821,6 +1826,9 @@ sh %{_sysconfdir}/sysconfig/modules/kvm.modules &> /dev/null || :
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Sep 21 2023 Eduard Abdullin <eabdullin@almalinux.org> - 6.2.0-33.el8_8.alma.1
|
||||||
|
- Apply io-remove-io-watch-if-TLS-channel-is-closed.patch
|
||||||
|
|
||||||
* Mon Mar 13 2023 Jon Maloy <jmaloy@redhat.com> - 6.2.0-32.el8_8
|
* Mon Mar 13 2023 Jon Maloy <jmaloy@redhat.com> - 6.2.0-32.el8_8
|
||||||
- kvm-aio_wait_kick-add-missing-memory-barrier.patch [bz#2168472]
|
- kvm-aio_wait_kick-add-missing-memory-barrier.patch [bz#2168472]
|
||||||
- kvm-qatomic-add-smp_mb__before-after_rmw.patch [bz#2168472]
|
- kvm-qatomic-add-smp_mb__before-after_rmw.patch [bz#2168472]
|
||||||
|
Loading…
Reference in New Issue
Block a user