diff options
-rw-r--r-- | meta/recipes-devtools/qemu/qemu.inc | 1 | ||||
-rw-r--r-- | meta/recipes-devtools/qemu/qemu/CVE-2023-3354.patch | 88 |
2 files changed, 89 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc index fbfc9f7499..c8e1d28654 100644 --- a/meta/recipes-devtools/qemu/qemu.inc +++ b/meta/recipes-devtools/qemu/qemu.inc | |||
@@ -40,6 +40,7 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \ | |||
40 | file://CVE-2023-3301.patch \ | 40 | file://CVE-2023-3301.patch \ |
41 | file://CVE-2023-3255.patch \ | 41 | file://CVE-2023-3255.patch \ |
42 | file://CVE-2023-2861.patch \ | 42 | file://CVE-2023-2861.patch \ |
43 | file://CVE-2023-3354.patch \ | ||
43 | " | 44 | " |
44 | UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar" | 45 | UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar" |
45 | 46 | ||
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2023-3354.patch b/meta/recipes-devtools/qemu/qemu/CVE-2023-3354.patch new file mode 100644 index 0000000000..b3958ecbf5 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/CVE-2023-3354.patch | |||
@@ -0,0 +1,88 @@ | |||
1 | From 10be627d2b5ec2d6b3dce045144aa739eef678b4 Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniel P. Berrangé <berrange@redhat.com> | ||
3 | Date: Tue, 12 Sep 2023 06:38:03 +0000 | ||
4 | Subject: [PATCH] io: remove io watch if TLS channel is closed during handshake | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | The TLS handshake make take some time to complete, during which time an | ||
10 | I/O watch might be registered with the main loop. If the owner of the | ||
11 | I/O channel invokes qio_channel_close() while the handshake is waiting | ||
12 | to continue the I/O watch must be removed. Failing to remove it will | ||
13 | later trigger the completion callback which the owner is not expecting | ||
14 | to receive. In the case of the VNC server, this results in a SEGV as | ||
15 | vnc_disconnect_start() tries to shutdown a client connection that is | ||
16 | already gone / NULL. | ||
17 | |||
18 | CVE-2023-3354 | ||
19 | Reported-by: jiangyegen <jiangyegen@huawei.com> | ||
20 | Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> | ||
21 | |||
22 | CVE: CVE-2023-3354 | ||
23 | |||
24 | Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/10be627d2b5ec2d6b3dce045144aa739eef678b4] | ||
25 | |||
26 | Signed-off-by: Yogita Urade <yogita.urade@windriver.com> | ||
27 | --- | ||
28 | include/io/channel-tls.h | 1 + | ||
29 | io/channel-tls.c | 18 ++++++++++++------ | ||
30 | 2 files changed, 13 insertions(+), 6 deletions(-) | ||
31 | |||
32 | diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h | ||
33 | index 5672479e9..ccd510ade 100644 | ||
34 | --- a/include/io/channel-tls.h | ||
35 | +++ b/include/io/channel-tls.h | ||
36 | @@ -48,6 +48,7 @@ struct QIOChannelTLS { | ||
37 | QIOChannel *master; | ||
38 | QCryptoTLSSession *session; | ||
39 | QIOChannelShutdown shutdown; | ||
40 | + guint hs_ioc_tag; | ||
41 | }; | ||
42 | |||
43 | /** | ||
44 | diff --git a/io/channel-tls.c b/io/channel-tls.c | ||
45 | index 4ce890a53..17d73f02e 100644 | ||
46 | --- a/io/channel-tls.c | ||
47 | +++ b/io/channel-tls.c | ||
48 | @@ -195,12 +195,13 @@ static void qio_channel_tls_handshake_task(QIOChannelTLS *ioc, | ||
49 | } | ||
50 | |||
51 | trace_qio_channel_tls_handshake_pending(ioc, status); | ||
52 | - qio_channel_add_watch_full(ioc->master, | ||
53 | - condition, | ||
54 | - qio_channel_tls_handshake_io, | ||
55 | - data, | ||
56 | - NULL, | ||
57 | - context); | ||
58 | + ioc->hs_ioc_tag = | ||
59 | + qio_channel_add_watch_full(ioc->master, | ||
60 | + condition, | ||
61 | + qio_channel_tls_handshake_io, | ||
62 | + data, | ||
63 | + NULL, | ||
64 | + context); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | @@ -215,6 +216,7 @@ static gboolean qio_channel_tls_handshake_io(QIOChannel *ioc, | ||
69 | QIOChannelTLS *tioc = QIO_CHANNEL_TLS( | ||
70 | qio_task_get_source(task)); | ||
71 | |||
72 | + tioc->hs_ioc_tag = 0; | ||
73 | g_free(data); | ||
74 | qio_channel_tls_handshake_task(tioc, task, context); | ||
75 | |||
76 | @@ -374,6 +376,10 @@ static int qio_channel_tls_close(QIOChannel *ioc, | ||
77 | { | ||
78 | QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc); | ||
79 | |||
80 | + if (tioc->hs_ioc_tag) { | ||
81 | + g_clear_handle_id(&tioc->hs_ioc_tag, g_source_remove); | ||
82 | + } | ||
83 | + | ||
84 | return qio_channel_close(tioc->master, errp); | ||
85 | } | ||
86 | |||
87 | -- | ||
88 | 2.35.5 | ||