Your message dated Sat, 31 Aug 2024 12:30:55 +0100
with message-id 
<27c418b1a49ffc566f1b9635359e59f6a742be26.ca...@adam-barratt.org.uk>
and subject line Closing bugs for 11.11
has caused the Debian Bug report #1077652,
regarding bullseye-pu: package libvirt/7.0.0-3+deb11u3
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
1077652: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077652
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: bullseye
X-Debbugs-Cc: libv...@packages.debian.org
Control: affects -1 + src:libvirt
User: release.debian....@packages.debian.org
Usertags: pu

[ Reason ]

libvirt/7.0.0-3+deb11u2, currently in Bullseye, is vulnerable to several
no-DSA security issues.  These issues have been fixed for Buster LTS
(DLA 3778-1), so this is a regression for users upgrading to Bullseye
from Buster.

[ Impact ]

Users are vulnerable to (no-dsa) security issues.

[ Tests ]

AFAICT the code is architectured in several orthogonal components and
drivers, and the DEP-8 smoke tests only cover some of them such as LXC
or QEMU/KVM.

The bulk of the proposed change touches the libxl driver (Xen) which is
not covered by DEP-8 tests, so I tested that one more carefully, but
also ran manual tests for KVM on a test hypervisor.

[ Risks ]

All patches are backported from upstream and applied cleanly (except for
the libxl-related ones).

[ Checklist ]

  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in oldstable
  [x] the issue is verified as fixed in unstable

[ Changes ]

  * Fix CVE-2021-3631: SELinux MCS may be accessed by another machine.
  * Fix CVE-2021-3667: Improper locking in the
    virStoragePoolLookupByTargetPath API.
  * Fix CVE-2021-3975: Use-after-free vulnerability. The
    qemuMonitorUnregister() function in qemuProcessHandleMonitorEOF is called
    using multiple threads without being adequately protected by a monitor
    lock.
  * Fix CVE-2021-4147: Deadlock and crash in libxl driver.
  * libxl: Fix regression in domain shutdown.
  * Fix CVE-2022-0897: Missing locking in nwfilterConnectNumOfNWFilters.
  * Fix CVE-2024-1441: Off-by-one error in the udevListInterfacesByStatus()
    function.
  * Fix CVE-2024-2494: Missing check for negative array lengths in RPC server
    de-serialization routines.
  * Fix CVE-2024-2496: NULL pointer dereference in the
    udevConnectListAllInterfaces() function.

-- 
Guilhem.
diffstat for libvirt-7.0.0 libvirt-7.0.0

 changelog                               |   24 +++
 patches/CVE-2021-3631.patch             |   49 ++++++
 patches/CVE-2021-3667.patch             |   36 +++++
 patches/CVE-2021-3975.patch             |   37 +++++
 patches/CVE-2021-4147_1.patch           |  111 +++++++++++++++
 patches/CVE-2021-4147_2.patch           |   68 +++++++++
 patches/CVE-2021-4147_3.patch           |   32 ++++
 patches/CVE-2021-4147_4.patch           |  145 ++++++++++++++++++++
 patches/CVE-2021-4147_5.patch           |  172 ++++++++++++++++++++++++
 patches/CVE-2021-4147_6.patch           |   90 ++++++++++++
 patches/CVE-2022-0897.patch             |   48 ++++++
 patches/CVE-2024-1441.patch             |   35 ++++
 patches/CVE-2024-2494.patch             |  212 ++++++++++++++++++++++++++++++
 patches/CVE-2024-2496.patch             |   86 ++++++++++++
 patches/libxl-Fix-domain-shutdown.patch |  226 ++++++++++++++++++++++++++++++++
 patches/series                          |   14 +
 16 files changed, 1385 insertions(+)

diff -Nru libvirt-7.0.0/debian/changelog libvirt-7.0.0/debian/changelog
--- libvirt-7.0.0/debian/changelog      2023-02-06 17:50:14.000000000 +0100
+++ libvirt-7.0.0/debian/changelog      2024-07-30 21:35:28.000000000 +0200
@@ -1,3 +1,27 @@
+libvirt (7.0.0-3+deb11u3) bullseye; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix CVE-2021-3631: SELinux MCS may be accessed by another machine.
+    (Closes: #990709)
+  * Fix CVE-2021-3667: Improper locking in the
+    virStoragePoolLookupByTargetPath API. (Closes: #991594)
+  * Fix CVE-2021-3975: Use-after-free vulnerability. The
+    qemuMonitorUnregister() function in qemuProcessHandleMonitorEOF is called
+    using multiple threads without being adequately protected by a monitor
+    lock.
+  * Fix CVE-2021-4147: Deadlock and crash in libxl driver. (Closes: #1002535)
+  * libxl: Fix regression in domain shutdown.
+  * Fix CVE-2022-0897: Missing locking in nwfilterConnectNumOfNWFilters.
+    (Closes: #1009075)
+  * Fix CVE-2024-1441: Off-by-one error in the udevListInterfacesByStatus()
+    function. (Closes: #1066058)
+  * Fix CVE-2024-2494: Missing check for negative array lengths in RPC server
+    de-serialization routines. (Closes: #1067461)
+  * Fix CVE-2024-2496: NULL pointer dereference in the
+    udevConnectListAllInterfaces() function.
+
+ -- Guilhem Moulin <guil...@debian.org>  Tue, 30 Jul 2024 21:35:28 +0200
+
 libvirt (7.0.0-3+deb11u2) bullseye; urgency=medium
 
   * [461d540] Fix libxl config test failures.
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-3631.patch 
libvirt-7.0.0/debian/patches/CVE-2021-3631.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-3631.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-3631.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,49 @@
+From: Daniel P. Berrangé <berra...@redhat.com>
+Date: Mon, 28 Jun 2021 13:09:04 +0100
+Subject: security: fix SELinux label generation logic
+
+A process can access a file if the set of MCS categories
+for the file is equal-to *or* a subset-of, the set of
+MCS categories for the process.
+
+If there are two VMs:
+
+  a) svirt_t:s0:c117
+  b) svirt_t:s0:c117,c720
+
+Then VM (b) is able to access files labelled for VM (a).
+
+IOW, we must discard case where the categories are equal
+because that is a subset of many other valid category pairs.
+
+Reviewed-by: Peter Krempa <pkre...@redhat.com>
+Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/15073504dbb624d3f6c911e85557019d3620fdb2
+Bug: https://gitlab.com/libvirt/libvirt/-/issues/153
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-3631
+Bug-Debian: https://bugs.debian.org/990709
+---
+ src/security/security_selinux.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
+index 2fc6ef2..61a871e 100644
+--- a/src/security/security_selinux.c
++++ b/src/security/security_selinux.c
+@@ -389,7 +389,15 @@ virSecuritySELinuxMCSFind(virSecurityManagerPtr mgr,
+         VIR_DEBUG("Try cat %s:c%d,c%d", sens, c1 + catMin, c2 + catMin);
+ 
+         if (c1 == c2) {
+-            mcs = g_strdup_printf("%s:c%d", sens, catMin + c1);
++            /*
++             * A process can access a file if the set of MCS categories
++             * for the file is equal-to *or* a subset-of, the set of
++             * MCS categories for the process.
++             *
++             * IOW, we must discard case where the categories are equal
++             * because that is a subset of other category pairs.
++             */
++            continue;
+         } else {
+             if (c1 > c2) {
+                 int t = c1;
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-3667.patch 
libvirt-7.0.0/debian/patches/CVE-2021-3667.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-3667.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-3667.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,36 @@
+From: Peter Krempa <pkre...@redhat.com>
+Date: Wed, 21 Jul 2021 11:22:25 +0200
+Subject: storage_driver: Unlock object on ACL fail in
+ storagePoolLookupByTargetPath
+
+'virStoragePoolObjListSearch' returns a locked and refed object, thus we
+must release it on ACL permission failure.
+
+Fixes: 7aa0e8c0cb8
+Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1984318
+Signed-off-by: Peter Krempa <pkre...@redhat.com>
+Reviewed-by: Michal Privoznik <mpriv...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/447f69dec47e1b0bd15ecd7cd49a9fd3b050fb87
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1984318
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-3667
+Bug-Debian: https://bugs.debian.org/991594
+---
+ src/storage/storage_driver.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
+index 16bc53a..2787c16 100644
+--- a/src/storage/storage_driver.c
++++ b/src/storage/storage_driver.c
+@@ -1739,8 +1739,10 @@ storagePoolLookupByTargetPath(virConnectPtr conn,
+                                            
storagePoolLookupByTargetPathCallback,
+                                            cleanpath))) {
+         def = virStoragePoolObjGetDef(obj);
+-        if (virStoragePoolLookupByTargetPathEnsureACL(conn, def) < 0)
++        if (virStoragePoolLookupByTargetPathEnsureACL(conn, def) < 0) {
++            virStoragePoolObjEndAPI(&obj);
+             return NULL;
++        }
+ 
+         pool = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL);
+         virStoragePoolObjEndAPI(&obj);
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-3975.patch 
libvirt-7.0.0/debian/patches/CVE-2021-3975.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-3975.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-3975.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,37 @@
+From: Peng Liang <liangpen...@huawei.com>
+Date: Wed, 24 Feb 2021 19:28:23 +0800
+Subject: qemu: Add missing lock in qemuProcessHandleMonitorEOF
+
+qemuMonitorUnregister will be called in multiple threads (e.g. threads
+in rpc worker pool and the vm event thread).  In some cases, it isn't
+protected by the monitor lock, which may lead to call g_source_unref
+more than one time and a use-after-free problem eventually.
+
+Add the missing lock in qemuProcessHandleMonitorEOF (which is the only
+position missing lock of monitor I found).
+
+Suggested-by: Michal Privoznik <mpriv...@redhat.com>
+Signed-off-by: Peng Liang <liangpen...@huawei.com>
+Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
+Reviewed-by: Michal Privoznik <mpriv...@redhat.com>
+Origin: 
https://github.com/libvirt/libvirt/commit/1ac703a7d0789e46833f4013a3876c2e3af18ec7
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2024326
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-3975
+---
+ src/qemu/qemu_process.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
+index 202d867..3f7355f 100644
+--- a/src/qemu/qemu_process.c
++++ b/src/qemu/qemu_process.c
+@@ -317,7 +317,9 @@ qemuProcessHandleMonitorEOF(qemuMonitorPtr mon,
+     /* We don't want this EOF handler to be called over and over while the
+      * thread is waiting for a job.
+      */
++    virObjectLock(mon);
+     qemuMonitorUnregister(mon);
++    virObjectUnlock(mon);
+ 
+     /* We don't want any cleanup from EOF handler (or any other
+      * thread) to enter qemu namespace. */
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_1.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_1.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_1.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_1.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,111 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Fri, 29 Oct 2021 14:16:33 -0600
+Subject: libxl: Disable death events after receiving a shutdown event
+
+The libxl driver will handle all domain destruction and cleanup
+when receiving a domain shutdown event from libxl. Commit fa30ee04a2a
+introduced the ignoreDeathEvent boolean in the DomainObjPrivate struct
+to ignore subsequent death events from libxl. But libxl already provides
+a mechanism to disable death events via libxl_evdisable_domain_death.
+
+This patch partially reverts commit fa30ee04a2a and instead uses
+libxl_evdisable_domain_death to disable subsequent death events when
+processing a shutdown event.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/23b51d7b8ec885e97a9277cf0a6c2833db4636e8
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 23 +++++------------------
+ src/libxl/libxl_domain.h |  3 ---
+ 2 files changed, 5 insertions(+), 21 deletions(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index 63938d5..f97c6da 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -614,12 +614,6 @@ static void
+ libxlDomainHandleDeath(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
+ {
+     virObjectEventPtr dom_event = NULL;
+-    libxlDomainObjPrivatePtr priv = vm->privateData;
+-
+-    if (priv->ignoreDeathEvent) {
+-        priv->ignoreDeathEvent = false;
+-        return;
+-    }
+ 
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+         return;
+@@ -667,7 +661,6 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+     }
+ 
+     if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
+-        libxlDomainObjPrivatePtr priv = vm->privateData;
+         struct libxlShutdownThreadInfo *shutdown_info = NULL;
+         virThread thread;
+         g_autofree char *name = NULL;
+@@ -684,12 +677,9 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+         name = g_strdup_printf("ev-%d", event->domid);
+         /*
+          * Cleanup will be handled by the shutdown thread.
+-         * Ignore the forthcoming death event from libxl
+          */
+-        priv->ignoreDeathEvent = true;
+         if (virThreadCreateFull(&thread, false, libxlDomainShutdownThread,
+                                 name, false, shutdown_info) < 0) {
+-             priv->ignoreDeathEvent = false;
+             /*
+              * Not much we can do on error here except log it.
+              */
+@@ -813,18 +803,17 @@ libxlDomainDestroyInternal(libxlDriverPrivatePtr driver,
+     libxlDomainObjPrivatePtr priv = vm->privateData;
+     int ret = -1;
+ 
+-    /* Ignore next LIBXL_EVENT_TYPE_DOMAIN_DEATH as the caller will handle
+-     * domain death appropriately already (having more info, like the reason).
+-     */
+-    priv->ignoreDeathEvent = true;
++    if (priv->deathW) {
++        libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
++        priv->deathW = NULL;
++    }
++
+     /* Unlock virDomainObj during destroy, which can take considerable
+      * time on large memory domains.
+      */
+     virObjectUnlock(vm);
+     ret = libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+     virObjectLock(vm);
+-    if (ret)
+-        priv->ignoreDeathEvent = false;
+ 
+     return ret;
+ }
+@@ -877,8 +866,6 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
+         priv->deathW = NULL;
+     }
+ 
+-    priv->ignoreDeathEvent = false;
+-
+     if (!!g_atomic_int_dec_and_test(&driver->nactive) && 
driver->inhibitCallback)
+         driver->inhibitCallback(false, driver->inhibitOpaque);
+ 
+diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
+index 0068254..e06a88b 100644
+--- a/src/libxl/libxl_domain.h
++++ b/src/libxl/libxl_domain.h
+@@ -62,9 +62,6 @@ struct _libxlDomainObjPrivate {
+     /* console */
+     virChrdevsPtr devs;
+     libxl_evgen_domain_death *deathW;
+-    /* Flag to indicate the upcoming LIBXL_EVENT_TYPE_DOMAIN_DEATH is caused
+-     * by libvirt and should not be handled separately */
+-    bool ignoreDeathEvent;
+     virThreadPtr migrationDstReceiveThr;
+     unsigned short migrationPort;
+     char *lockState;
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_2.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_2.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_2.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_2.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,68 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Wed, 24 Nov 2021 11:10:19 -0700
+Subject: libxl: Rename libxlShutdownThreadInfo struct
+
+An upcoming change will use the struct in a thread created to process
+death events. Rename libxlShutdownThreadInfo to libxlEventHandlerThreadInfo
+to reflect the more generic usage.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/a4e6fba069c0809b8b5dde5e9db62d2efd91b4a0
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index f97c6da..6ad9ab7 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -473,7 +473,7 @@ libxlDomainShutdownHandleRestart(libxlDriverPrivatePtr 
driver,
+ }
+ 
+ 
+-struct libxlShutdownThreadInfo
++struct libxlEventHandlerThreadInfo
+ {
+     libxlDriverPrivatePtr driver;
+     virDomainObjPtr vm;
+@@ -484,7 +484,7 @@ struct libxlShutdownThreadInfo
+ static void
+ libxlDomainShutdownThread(void *opaque)
+ {
+-    struct libxlShutdownThreadInfo *shutdown_info = opaque;
++    struct libxlEventHandlerThreadInfo *shutdown_info = opaque;
+     virDomainObjPtr vm = shutdown_info->vm;
+     libxl_event *ev = shutdown_info->event;
+     libxlDriverPrivatePtr driver = shutdown_info->driver;
+@@ -661,7 +661,7 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+     }
+ 
+     if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
+-        struct libxlShutdownThreadInfo *shutdown_info = NULL;
++        struct libxlEventHandlerThreadInfo *shutdown_info = NULL;
+         virThread thread;
+         g_autofree char *name = NULL;
+ 
+@@ -669,7 +669,7 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+          * Start a thread to handle shutdown.  We don't want to be tying up
+          * libxl's event machinery by doing a potentially lengthy shutdown.
+          */
+-        shutdown_info = g_new0(struct libxlShutdownThreadInfo, 1);
++        shutdown_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
+ 
+         shutdown_info->driver = driver;
+         shutdown_info->vm = vm;
+@@ -689,7 +689,7 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+         }
+         /*
+          * virDomainObjEndAPI is called in the shutdown thread, where
+-         * libxlShutdownThreadInfo and libxl_event are also freed.
++         * libxlEventHandlerThreadInfo and libxl_event are also freed.
+          */
+         return;
+     } else if (event->type == LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_3.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_3.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_3.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_3.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,32 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Wed, 24 Nov 2021 11:16:38 -0700
+Subject: libxl: Modify name of shutdown thread
+
+The current thread name 'ev-<domid>' is a bit terse. Change the name
+to 'shutdown-event-<domid>', allowing it to be distinguished between
+thread handling other event types.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/e4f7589a3ec285489618ca04c8c0230cc31f3d99
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index 6ad9ab7..2af9d31 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -674,7 +674,7 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+         shutdown_info->driver = driver;
+         shutdown_info->vm = vm;
+         shutdown_info->event = (libxl_event *)event;
+-        name = g_strdup_printf("ev-%d", event->domid);
++        name = g_strdup_printf("shutdown-event-%d", event->domid);
+         /*
+          * Cleanup will be handled by the shutdown thread.
+          */
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_4.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_4.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_4.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_4.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,145 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Wed, 24 Nov 2021 11:36:55 -0700
+Subject: libxl: Handle domain death events in a thread
+
+Similar to domain shutdown events, processing domain death events can be a
+lengthy process and we don't want to block the event handler while the
+operation completes. Move the death handling function to a thread.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/b9a5faea49b7412e26d7389af4c32fc2b3ee80e5
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 67 +++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 47 insertions(+), 20 deletions(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index 2af9d31..f541469 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -611,12 +611,17 @@ libxlDomainShutdownThread(void *opaque)
+ }
+ 
+ static void
+-libxlDomainHandleDeath(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
++libxlDomainDeathThread(void *opaque)
+ {
++    struct libxlEventHandlerThreadInfo *death_info = opaque;
++    virDomainObjPtr vm = death_info->vm;
++    libxl_event *ev = death_info->event;
++    libxlDriverPrivatePtr driver = death_info->driver;
+     virObjectEventPtr dom_event = NULL;
++    g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
+ 
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+-        return;
++        goto cleanup;
+ 
+     virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, 
VIR_DOMAIN_SHUTOFF_DESTROYED);
+     dom_event = virDomainEventLifecycleNewFromObj(vm,
+@@ -627,6 +632,11 @@ libxlDomainHandleDeath(libxlDriverPrivatePtr driver, 
virDomainObjPtr vm)
+         virDomainObjListRemove(driver->domains, vm);
+     libxlDomainObjEndJob(driver, vm);
+     virObjectEventStateQueue(driver->domainEventState, dom_event);
++
++ cleanup:
++    virDomainObjEndAPI(&vm);
++    libxl_event_free(cfg->ctx, ev);
++    VIR_FREE(death_info);
+ }
+ 
+ 
+@@ -640,6 +650,9 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+     libxl_shutdown_reason xl_reason = 
event->u.domain_shutdown.shutdown_reason;
+     virDomainObjPtr vm = NULL;
+     g_autoptr(libxlDriverConfig) cfg = NULL;
++    struct libxlEventHandlerThreadInfo *thread_info = NULL;
++    virThread thread;
++    g_autofree char *thread_name = NULL;
+ 
+     if (event->type != LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN &&
+             event->type != LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
+@@ -660,31 +673,27 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+         goto cleanup;
+     }
+ 
++    /*
++     * Start event-specific threads to handle shutdown and death.
++     * They are potentially lengthy operations and we don't want to be
++     * blocking this event handler while they are in progress.
++     */
+     if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
+-        struct libxlEventHandlerThreadInfo *shutdown_info = NULL;
+-        virThread thread;
+-        g_autofree char *name = NULL;
+-
+-        /*
+-         * Start a thread to handle shutdown.  We don't want to be tying up
+-         * libxl's event machinery by doing a potentially lengthy shutdown.
+-         */
+-        shutdown_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
++        thread_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
+ 
+-        shutdown_info->driver = driver;
+-        shutdown_info->vm = vm;
+-        shutdown_info->event = (libxl_event *)event;
+-        name = g_strdup_printf("shutdown-event-%d", event->domid);
++        thread_info->driver = driver;
++        thread_info->vm = vm;
++        thread_info->event = (libxl_event *)event;
++        thread_name = g_strdup_printf("shutdown-event-%d", event->domid);
+         /*
+          * Cleanup will be handled by the shutdown thread.
+          */
+         if (virThreadCreateFull(&thread, false, libxlDomainShutdownThread,
+-                                name, false, shutdown_info) < 0) {
++                                thread_name, false, thread_info) < 0) {
+             /*
+              * Not much we can do on error here except log it.
+              */
+             VIR_ERROR(_("Failed to create thread to handle domain shutdown"));
+-            VIR_FREE(shutdown_info);
+             goto cleanup;
+         }
+         /*
+@@ -693,15 +702,33 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+          */
+         return;
+     } else if (event->type == LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
++        thread_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
++
++        thread_info->driver = driver;
++        thread_info->vm = vm;
++        thread_info->event = (libxl_event *)event;
++        thread_name = g_strdup_printf("death-event-%d", event->domid);
+         /*
+-         * On death the domain is cleaned up from Xen's perspective.
+-         * Cleanup on the libvirt side can be done synchronously.
++         * Cleanup will be handled by the death thread.
+          */
+-        libxlDomainHandleDeath(driver, vm);
++        if (virThreadCreateFull(&thread, false, libxlDomainDeathThread,
++                                thread_name, false, thread_info) < 0) {
++            /*
++             * Not much we can do on error here except log it.
++             */
++            VIR_ERROR(_("Failed to create thread to handle domain death"));
++            goto cleanup;
++        }
++        /*
++         * virDomainObjEndAPI is called in the death thread, where
++         * libxlEventHandlerThreadInfo and libxl_event are also freed.
++         */
++        return;
+     }
+ 
+  cleanup:
+     virDomainObjEndAPI(&vm);
++    VIR_FREE(thread_info);
+     cfg = libxlDriverConfigGet(driver);
+     /* Cast away any const */
+     libxl_event_free(cfg->ctx, (libxl_event *)event);
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_5.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_5.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_5.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_5.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,172 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Wed, 24 Nov 2021 11:48:51 -0700
+Subject: libxl: Search for virDomainObj in event handler threads
+
+libxl can deliver events and invoke callbacks on any application thread
+calling into libxl. This can cause deadlock in the libvirt libxl driver
+
+Thread 19 (Thread 0x7f31411ec700 (LWP 14068) "libvirtd"):
+#0  0x00007f318520cc7d in __lll_lock_wait () from /lib64/libpthread.so.0
+#1  0x00007f3185205ed5 in pthread_mutex_lock () from /lib64/libpthread.so.0
+#2  0x00007f3189488015 in virMutexLock (m=<optimized out>) at 
../../src/util/virthread.c:79
+#3  0x00007f3189463f3b in virObjectLock (anyobj=<optimized out>) at 
../../src/util/virobject.c:433
+#4  0x00007f31894f2f41 in virDomainObjListSearchID (payload=0x7f317400a6d0, 
name=<optimized out>, data=0x7f31411eaeac) at 
../../src/conf/virdomainobjlist.c:105
+#5  0x00007f3189437ac5 in virHashSearch (ctable=0x7f3124025a30, 
iter=iter@entry=0x7f31894f2f30 <virDomainObjListSearchID>, 
data=data@entry=0x7f31411eaeac, name=name@entry=0x0) at 
../../src/util/virhash.c:745
+#6  0x00007f31894f3919 in virDomainObjListFindByID (doms=0x7f3124025430, 
id=<optimized out>) at ../../src/conf/virdomainobjlist.c:121
+#7  0x00007f3152f292e5 in libxlDomainEventHandler (data=0x7f3124023d80, 
event=0x7f310c010ae0) at ../../src/libxl/libxl_domain.c:660
+#8  0x00007f3152c6ff5d in egc_run_callbacks (egc=egc@entry=0x7f31411eaf50) at 
libxl_event.c:1427
+#9  0x00007f3152c718bd in libxl__egc_cleanup (egc=0x7f31411eaf50) at 
libxl_event.c:1458
+#10 libxl__ao_inprogress (ao=ao@entry=0x7f310c00b8a0, 
file=file@entry=0x7f3152cce987 "libxl_domain.c", line=line@entry=730, 
func=func@entry=0x7f3152ccf750 <__func__.22238> "libxl_domain_unpause") at 
libxl_event.c:2047
+#11 0x00007f3152c8c5b8 in libxl_domain_unpause (ctx=0x7f3124015a40, 
domid=<optimized out>, ao_how=ao_how@entry=0x0) at libxl_domain.c:730
+#12 0x00007f3152f2a584 in libxl_domain_unpause_0x041200 (domid=<optimized 
out>, ctx=<optimized out>) at /usr/include/libxl.h:1756
+#13 libxlDomainStart (driver=driver@entry=0x7f3124023d80, 
vm=vm@entry=0x7f317400a6d0, start_paused=start_paused@entry=false, 
restore_fd=restore_fd@entry=-1, restore_ver=<optimized out>, 
restore_ver@entry=2) at ../../src/libxl/libxl_domain.c:1482
+#14 0x00007f3152f2a6e3 in libxlDomainStartNew 
(driver=driver@entry=0x7f3124023d80, vm=vm@entry=0x7f317400a6d0, 
start_paused=start_paused@entry=false) at ../../src/libxl/libxl_domain.c:1545
+#15 0x00007f3152f2a789 in libxlDomainShutdownHandleRestart 
(driver=0x7f3124023d80, vm=0x7f317400a6d0) at ../../src/libxl/libxl_domain.c:464
+#16 0x00007f3152f2a9e4 in libxlDomainShutdownThread (opaque=<optimized out>) 
at ../../src/libxl/libxl_domain.c:559
+#17 0x00007f3189487ee2 in virThreadHelper (data=<optimized out>) at 
../../src/util/virthread.c:196
+#18 0x00007f3185203539 in start_thread () from /lib64/libpthread.so.0
+#19 0x00007f3184f3becf in clone () from /lib64/libc.so.6
+
+Frame 16 runs a thread created to handle domain shutdown processing for
+domid 28712. In this case the event contained the reboot reason, so the
+old domain is destroyed and a new one is created by libxlDomainStart new.
+After starting the domain, it is unpaused by calling libxl_domain_unpause
+in frame 12. While the thread is running within libxl, libxl takes the
+opportunity to deliver a pending domain shutdown event for unrelated domid
+28710. While searching for the associated virDomainObj by ID, a deadlock is
+encountered when attempting to lock the virDomainObj for domid 28712, which
+is already locked since this thread is processing its shutdown event.
+
+The deadlock can be avoided by moving the search for a virDomainObj
+associated with the event domid to the shutdown thread. The same is done
+for the death thread.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/5c5df5310f72be4878a71ace47074c54e0d1a27d
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 35 ++++++++++++++++++-----------------
+ 1 file changed, 18 insertions(+), 17 deletions(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index f541469..0127211 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -476,7 +476,6 @@ libxlDomainShutdownHandleRestart(libxlDriverPrivatePtr 
driver,
+ struct libxlEventHandlerThreadInfo
+ {
+     libxlDriverPrivatePtr driver;
+-    virDomainObjPtr vm;
+     libxl_event *event;
+ };
+ 
+@@ -485,7 +484,7 @@ static void
+ libxlDomainShutdownThread(void *opaque)
+ {
+     struct libxlEventHandlerThreadInfo *shutdown_info = opaque;
+-    virDomainObjPtr vm = shutdown_info->vm;
++    virDomainObjPtr vm = NULL;
+     libxl_event *ev = shutdown_info->event;
+     libxlDriverPrivatePtr driver = shutdown_info->driver;
+     virObjectEventPtr dom_event = NULL;
+@@ -495,6 +494,12 @@ libxlDomainShutdownThread(void *opaque)
+ 
+     libxl_domain_config_init(&d_config);
+ 
++    vm = virDomainObjListFindByID(driver->domains, ev->domid);
++    if (!vm) {
++        /* Nothing to do if we can't find the virDomainObj */
++        goto cleanup;
++    }
++
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+         goto cleanup;
+ 
+@@ -614,12 +619,18 @@ static void
+ libxlDomainDeathThread(void *opaque)
+ {
+     struct libxlEventHandlerThreadInfo *death_info = opaque;
+-    virDomainObjPtr vm = death_info->vm;
++    virDomainObjPtr vm = NULL;
+     libxl_event *ev = death_info->event;
+     libxlDriverPrivatePtr driver = death_info->driver;
+     virObjectEventPtr dom_event = NULL;
+     g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
+ 
++    vm = virDomainObjListFindByID(driver->domains, ev->domid);
++    if (!vm) {
++        /* Nothing to do if we can't find the virDomainObj */
++        goto cleanup;
++    }
++
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+         goto cleanup;
+ 
+@@ -648,7 +659,6 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+ {
+     libxlDriverPrivatePtr driver = data;
+     libxl_shutdown_reason xl_reason = 
event->u.domain_shutdown.shutdown_reason;
+-    virDomainObjPtr vm = NULL;
+     g_autoptr(libxlDriverConfig) cfg = NULL;
+     struct libxlEventHandlerThreadInfo *thread_info = NULL;
+     virThread thread;
+@@ -667,12 +677,6 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+     if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
+         goto cleanup;
+ 
+-    vm = virDomainObjListFindByID(driver->domains, event->domid);
+-    if (!vm) {
+-        /* Nothing to do if we can't find the virDomainObj */
+-        goto cleanup;
+-    }
+-
+     /*
+      * Start event-specific threads to handle shutdown and death.
+      * They are potentially lengthy operations and we don't want to be
+@@ -682,7 +686,6 @@ libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST 
libxl_event *event)
+         thread_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
+ 
+         thread_info->driver = driver;
+-        thread_info->vm = vm;
+         thread_info->event = (libxl_event *)event;
+         thread_name = g_strdup_printf("shutdown-event-%d", event->domid);
+         /*
+@@ -697,15 +700,14 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+             goto cleanup;
+         }
+         /*
+-         * virDomainObjEndAPI is called in the shutdown thread, where
+-         * libxlEventHandlerThreadInfo and libxl_event are also freed.
++         * libxlEventHandlerThreadInfo and libxl_event are freed in the
++         * shutdown thread
+          */
+         return;
+     } else if (event->type == LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
+         thread_info = g_new0(struct libxlEventHandlerThreadInfo, 1);
+ 
+         thread_info->driver = driver;
+-        thread_info->vm = vm;
+         thread_info->event = (libxl_event *)event;
+         thread_name = g_strdup_printf("death-event-%d", event->domid);
+         /*
+@@ -720,14 +722,13 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+             goto cleanup;
+         }
+         /*
+-         * virDomainObjEndAPI is called in the death thread, where
+-         * libxlEventHandlerThreadInfo and libxl_event are also freed.
++         * libxlEventHandlerThreadInfo and libxl_event are freed in the
++         * death thread
+          */
+         return;
+     }
+ 
+  cleanup:
+-    virDomainObjEndAPI(&vm);
+     VIR_FREE(thread_info);
+     cfg = libxlDriverConfigGet(driver);
+     /* Cast away any const */
diff -Nru libvirt-7.0.0/debian/patches/CVE-2021-4147_6.patch 
libvirt-7.0.0/debian/patches/CVE-2021-4147_6.patch
--- libvirt-7.0.0/debian/patches/CVE-2021-4147_6.patch  1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2021-4147_6.patch  2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,90 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Thu, 18 Nov 2021 12:03:20 -0700
+Subject: libxl: Protect access to libxlLogger files hash table
+
+The hash table of log file objects in libxlLogger is not protected against
+concurrent access. It is possible for one thread to remove an entry while
+another is updating it. Add a mutex to the libxlLogger object and lock it
+when accessing the files hash table.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Daniel P. Berrangé <berra...@redhat.com>
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/a7a03324d86e111f81687b5315b8f296dde84340
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_logger.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/src/libxl/libxl_logger.c b/src/libxl/libxl_logger.c
+index 93a9c76..4113d67 100644
+--- a/src/libxl/libxl_logger.c
++++ b/src/libxl/libxl_logger.c
+@@ -28,6 +28,7 @@
+ #include "util/virfile.h"
+ #include "util/virhash.h"
+ #include "util/virstring.h"
++#include "util/virthread.h"
+ #include "util/virtime.h"
+ 
+ #define VIR_FROM_THIS VIR_FROM_LIBXL
+@@ -43,6 +44,7 @@ struct xentoollog_logger_libvirt {
+ 
+     /* map storing the opened fds: "domid" -> FILE* */
+     GHashTable *files;
++    virMutex tableLock;
+     FILE *defaultLogFile;
+ };
+ 
+@@ -85,7 +87,9 @@ libvirt_vmessage(xentoollog_logger *logger_in,
+         start = start + 9;
+         *end = '\0';
+ 
++        virMutexLock(&lg->tableLock);
+         domainLogFile = virHashLookup(lg->files, start);
++        virMutexUnlock(&lg->tableLock);
+         if (domainLogFile)
+             logFile = domainLogFile;
+ 
+@@ -161,6 +165,11 @@ libxlLoggerNew(const char *logDir, virLogPriority 
minLevel)
+     if ((logger.defaultLogFile = fopen(path, "a")) == NULL)
+         goto error;
+ 
++    if (virMutexInit(&logger.tableLock) < 0) {
++        VIR_FORCE_FCLOSE(logger.defaultLogFile);
++        goto error;
++    }
++
+     logger_out = XTL_NEW_LOGGER(libvirt, logger);
+ 
+  cleanup:
+@@ -179,6 +188,7 @@ libxlLoggerFree(libxlLoggerPtr logger)
+     if (logger->defaultLogFile)
+         VIR_FORCE_FCLOSE(logger->defaultLogFile);
+     virHashFree(logger->files);
++    virMutexDestroy(&logger->tableLock);
+     xtl_logger_destroy(xtl_logger);
+ }
+ 
+@@ -200,7 +210,9 @@ libxlLoggerOpenFile(libxlLoggerPtr logger,
+                  path, g_strerror(errno));
+         goto cleanup;
+     }
++    virMutexLock(&logger->tableLock);
+     ignore_value(virHashAddEntry(logger->files, domidstr, logFile));
++    virMutexUnlock(&logger->tableLock);
+ 
+     /* domain_config is non NULL only when starting a new domain */
+     if (domain_config) {
+@@ -219,7 +231,9 @@ libxlLoggerCloseFile(libxlLoggerPtr logger, int id)
+     char *domidstr = NULL;
+     domidstr = g_strdup_printf("%d", id);
+ 
++    virMutexLock(&logger->tableLock);
+     ignore_value(virHashRemoveEntry(logger->files, domidstr));
++    virMutexUnlock(&logger->tableLock);
+ 
+     VIR_FREE(domidstr);
+ }
diff -Nru libvirt-7.0.0/debian/patches/CVE-2022-0897.patch 
libvirt-7.0.0/debian/patches/CVE-2022-0897.patch
--- libvirt-7.0.0/debian/patches/CVE-2022-0897.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2022-0897.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,48 @@
+From: Daniel P. Berrangé <berra...@redhat.com>
+Date: Tue, 8 Mar 2022 17:28:38 +0000
+Subject: nwfilter: fix crash when counting number of network filters
+
+The virNWFilterObjListNumOfNWFilters method iterates over the
+driver->nwfilters, accessing virNWFilterObj instances. As such
+it needs to be protected against concurrent modification of
+the driver->nwfilters object.
+
+This API allows unprivileged users to connect, so users with
+read-only access to libvirt can cause a denial of service
+crash if they are able to race with a call of virNWFilterUndefine.
+Since network filters are usually statically defined, this is
+considered a low severity problem.
+
+This is assigned CVE-2022-0897.
+
+Reviewed-by: Eric Blake <ebl...@redhat.com>
+Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/a4947e8f63c3e6b7b067b444f3d6cf674c0d7f36
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2022-0897
+Bug-Debian: https://bugs.debian.org/1009075
+---
+ src/nwfilter/nwfilter_driver.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
+index 1b8e3db..4b09518 100644
+--- a/src/nwfilter/nwfilter_driver.c
++++ b/src/nwfilter/nwfilter_driver.c
+@@ -478,11 +478,15 @@ nwfilterLookupByName(virConnectPtr conn,
+ static int
+ nwfilterConnectNumOfNWFilters(virConnectPtr conn)
+ {
++    int ret;
+     if (virConnectNumOfNWFiltersEnsureACL(conn) < 0)
+         return -1;
+ 
+-    return virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn,
+-                                        virConnectNumOfNWFiltersCheckACL);
++    nwfilterDriverLock();
++    ret = virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn,
++                                           virConnectNumOfNWFiltersCheckACL);
++    nwfilterDriverUnlock();
++    return ret;
+ }
+ 
+ 
diff -Nru libvirt-7.0.0/debian/patches/CVE-2024-1441.patch 
libvirt-7.0.0/debian/patches/CVE-2024-1441.patch
--- libvirt-7.0.0/debian/patches/CVE-2024-1441.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2024-1441.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,35 @@
+From: Martin Kletzander <mklet...@redhat.com>
+Date: Tue, 27 Feb 2024 16:20:12 +0100
+Subject: Fix off-by-one error in udevListInterfacesByStatus
+
+Ever since this function was introduced in 2012 it could've tried
+filling in an extra interface name.  That was made worse in 2019 when
+the caller functions started accepting NULL arrays of size 0.
+
+This is assigned CVE-2024-1441.
+
+Signed-off-by: Martin Kletzander <mklet...@redhat.com>
+Reported-by: Alexander Kuznetsov <kuznetso...@altlinux.org>
+Fixes: 5a33366f5c0b18c93d161bd144f9f079de4ac8ca
+Fixes: d6064e2759a24e0802f363e3a810dc5a7d7ebb15
+Reviewed-by: Ján Tomko <jto...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/c664015fe3a7bf59db26686e9ed69af011c6ebb8
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2024-1441
+Bug-Debian: https://bugs.debian.org/1066058
+---
+ src/interface/interface_backend_udev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/interface/interface_backend_udev.c 
b/src/interface/interface_backend_udev.c
+index 6a94a45..65a5244 100644
+--- a/src/interface/interface_backend_udev.c
++++ b/src/interface/interface_backend_udev.c
+@@ -221,7 +221,7 @@ udevListInterfacesByStatus(virConnectPtr conn,
+         virInterfaceDefPtr def;
+ 
+         /* Ensure we won't exceed the size of our array */
+-        if (count > names_len)
++        if (count >= names_len)
+             break;
+ 
+         path = udev_list_entry_get_name(dev_entry);
diff -Nru libvirt-7.0.0/debian/patches/CVE-2024-2494.patch 
libvirt-7.0.0/debian/patches/CVE-2024-2494.patch
--- libvirt-7.0.0/debian/patches/CVE-2024-2494.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2024-2494.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,212 @@
+From: Daniel P. Berrangé <berra...@redhat.com>
+Date: Fri, 15 Mar 2024 10:47:50 +0000
+Subject: remote: check for negative array lengths before allocation
+
+While the C API entry points will validate non-negative lengths
+for various parameters, the RPC server de-serialization code
+will need to allocate memory for arrays before entering the C
+API. These allocations will thus happen before the non-negative
+length check is performed.
+
+Passing a negative length to the g_new0 function will usually
+result in a crash due to the negative length being treated as
+a huge positive number.
+
+This was found and diagnosed by ALT Linux Team with AFLplusplus.
+
+Reviewed-by: Michal Privoznik <mpriv...@redhat.com>
+Found-by: Alexandr Shashkin <duty...@altlinux.org>
+Co-developed-by: Alexander Kuznetsov <kuznetso...@altlinux.org>
+Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/8a3f8d957507c1f8223fdcf25a3ff885b15557f2
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2270115
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2024-2494
+Bug-Debian: https://bugs.debian.org/1067461
+---
+ src/remote/remote_daemon_dispatch.c | 65 +++++++++++++++++++++++++++++++++++++
+ src/rpc/gendispatch.pl              |  5 +++
+ 2 files changed, 70 insertions(+)
+
+diff --git a/src/remote/remote_daemon_dispatch.c 
b/src/remote/remote_daemon_dispatch.c
+index 46683aa..4def952 100644
+--- a/src/remote/remote_daemon_dispatch.c
++++ b/src/remote/remote_daemon_dispatch.c
+@@ -2330,6 +2330,10 @@ 
remoteDispatchDomainGetSchedulerParameters(virNetServerPtr server G_GNUC_UNUSED,
+     if (!conn)
+         goto cleanup;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -2378,6 +2382,10 @@ 
remoteDispatchDomainGetSchedulerParametersFlags(virNetServerPtr server G_GNUC_UN
+     if (!conn)
+         goto cleanup;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -2536,6 +2544,10 @@ remoteDispatchDomainBlockStatsFlags(virNetServerPtr 
server G_GNUC_UNUSED,
+         goto cleanup;
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_BLOCK_STATS_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -2764,6 +2776,14 @@ remoteDispatchDomainGetVcpuPinInfo(virNetServerPtr 
server G_GNUC_UNUSED,
+     if (!(dom = get_nonnull_domain(conn, args->dom)))
+         goto cleanup;
+ 
++    if (args->ncpumaps < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("ncpumaps must be 
non-negative"));
++        goto cleanup;
++    }
++    if (args->maplen < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maplen must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->ncpumaps > REMOTE_VCPUINFO_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("ncpumaps > 
REMOTE_VCPUINFO_MAX"));
+         goto cleanup;
+@@ -2858,6 +2878,11 @@ remoteDispatchDomainGetEmulatorPinInfo(virNetServerPtr 
server G_GNUC_UNUSED,
+     if (!(dom = get_nonnull_domain(conn, args->dom)))
+         goto cleanup;
+ 
++    if (args->maplen < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maplen must be 
non-negative"));
++        goto cleanup;
++    }
++
+     /* Allocate buffers to take the results */
+     if (args->maplen > 0)
+         cpumaps = g_new0(unsigned char, args->maplen);
+@@ -2905,6 +2930,14 @@ remoteDispatchDomainGetVcpus(virNetServerPtr server 
G_GNUC_UNUSED,
+     if (!(dom = get_nonnull_domain(conn, args->dom)))
+         goto cleanup;
+ 
++    if (args->maxinfo < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maxinfo must be 
non-negative"));
++        goto cleanup;
++    }
++    if (args->maplen < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maplen must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->maxinfo > REMOTE_VCPUINFO_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("maxinfo > 
REMOTE_VCPUINFO_MAX"));
+         goto cleanup;
+@@ -3145,6 +3178,10 @@ remoteDispatchDomainGetMemoryParameters(virNetServerPtr 
server G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -3205,6 +3242,10 @@ remoteDispatchDomainGetNumaParameters(virNetServerPtr 
server G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_NUMA_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -3265,6 +3306,10 @@ remoteDispatchDomainGetBlkioParameters(virNetServerPtr 
server G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -3326,6 +3371,10 @@ remoteDispatchNodeGetCPUStats(virNetServerPtr server 
G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_NODE_CPU_STATS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -3393,6 +3442,10 @@ remoteDispatchNodeGetMemoryStats(virNetServerPtr server 
G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_NODE_MEMORY_STATS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -3573,6 +3626,10 @@ remoteDispatchDomainGetBlockIoTune(virNetServerPtr 
server G_GNUC_UNUSED,
+     if (!conn)
+         goto cleanup;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_BLOCK_IO_TUNE_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -5117,6 +5174,10 @@ 
remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+@@ -5337,6 +5398,10 @@ remoteDispatchNodeGetMemoryParameters(virNetServerPtr 
server G_GNUC_UNUSED,
+ 
+     flags = args->flags;
+ 
++    if (args->nparams < 0) {
++        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams must be 
non-negative"));
++        goto cleanup;
++    }
+     if (args->nparams > REMOTE_NODE_MEMORY_PARAMETERS_MAX) {
+         virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
+         goto cleanup;
+diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
+index 0020273..84b239c 100755
+--- a/src/rpc/gendispatch.pl
++++ b/src/rpc/gendispatch.pl
+@@ -1073,6 +1073,11 @@ elsif ($mode eq "server") {
+         print "\n";
+ 
+         if ($single_ret_as_list) {
++            print "    if (args->$single_ret_list_max_var < 0) {\n";
++            print "        virReportError(VIR_ERR_RPC,\n";
++            print "                       \"%s\", 
_(\"max$single_ret_list_name must be non-negative\"));\n";
++            print "        goto cleanup;\n";
++            print "    }\n";
+             print "    if (args->$single_ret_list_max_var > 
$single_ret_list_max_define) {\n";
+             print "        virReportError(VIR_ERR_RPC,\n";
+             print "                       \"%s\", 
_(\"max$single_ret_list_name > $single_ret_list_max_define\"));\n";
diff -Nru libvirt-7.0.0/debian/patches/CVE-2024-2496.patch 
libvirt-7.0.0/debian/patches/CVE-2024-2496.patch
--- libvirt-7.0.0/debian/patches/CVE-2024-2496.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/CVE-2024-2496.patch    2024-07-30 
21:35:28.000000000 +0200
@@ -0,0 +1,86 @@
+From: Dmitry Frolov <fro...@swemel.ru>
+Date: Tue, 12 Sep 2023 15:56:47 +0300
+Subject: interface: fix udev_device_get_sysattr_value return value check
+
+Reviewing the code I found that return value of function
+udev_device_get_sysattr_value() is dereferenced without a check.
+udev_device_get_sysattr_value() may return NULL by number of reasons.
+
+v2: VIR_DEBUG added, replaced STREQ(NULLSTR()) with STREQ_NULLABLE()
+v3: More checks added, to skip earlier. More verbose VIR_DEBUG.
+
+Signed-off-by: Dmitry Frolov <fro...@swemel.ru>
+Reviewed-by: Martin Kletzander <mklet...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/2ca94317ac642a70921947150ced8acc674ccdc8
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2024-2496
+---
+ src/interface/interface_backend_udev.c | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+diff --git a/src/interface/interface_backend_udev.c 
b/src/interface/interface_backend_udev.c
+index 65a5244..74b24e8 100644
+--- a/src/interface/interface_backend_udev.c
++++ b/src/interface/interface_backend_udev.c
+@@ -23,6 +23,7 @@
+ #include <dirent.h>
+ #include <libudev.h>
+ 
++#include "virlog.h"
+ #include "virerror.h"
+ #include "virfile.h"
+ #include "datatypes.h"
+@@ -41,6 +42,8 @@
+ 
+ #define VIR_FROM_THIS VIR_FROM_INTERFACE
+ 
++VIR_LOG_INIT("interface.interface_backend_udev");
++
+ struct udev_iface_driver {
+     struct udev *udev;
+     /* pid file FD, ensures two copies of the driver can't use the same root 
*/
+@@ -357,11 +360,20 @@ udevConnectListAllInterfaces(virConnectPtr conn,
+         const char *macaddr;
+         virInterfaceDefPtr def;
+ 
+-        path = udev_list_entry_get_name(dev_entry);
+-        dev = udev_device_new_from_syspath(udev, path);
+-        name = udev_device_get_sysname(dev);
++        if (!(path = udev_list_entry_get_name(dev_entry))) {
++            VIR_DEBUG("Skipping interface, path == NULL");
++            continue;
++        }
++        if (!(dev = udev_device_new_from_syspath(udev, path))) {
++            VIR_DEBUG("Skipping interface '%s', dev == NULL", path);
++            continue;
++        }
++        if (!(name = udev_device_get_sysname(dev))) {
++            VIR_DEBUG("Skipping interface '%s', name == NULL", path);
++            continue;
++        }
+         macaddr = udev_device_get_sysattr_value(dev, "address");
+-        status = STREQ(udev_device_get_sysattr_value(dev, "operstate"), "up");
++        status = STREQ_NULLABLE(udev_device_get_sysattr_value(dev, 
"operstate"), "up");
+ 
+         def = udevGetMinimalDefForDevice(dev);
+         if (!virConnectListAllInterfacesCheckACL(conn, def)) {
+@@ -976,9 +988,9 @@ udevGetIfaceDef(struct udev *udev, const char *name)
+ 
+     /* MTU */
+     mtu_str = udev_device_get_sysattr_value(dev, "mtu");
+-    if (virStrToLong_ui(mtu_str, NULL, 10, &mtu) < 0) {
++    if (!mtu_str || virStrToLong_ui(mtu_str, NULL, 10, &mtu) < 0) {
+         virReportError(VIR_ERR_INTERNAL_ERROR,
+-                _("Could not parse MTU value '%s'"), mtu_str);
++                _("Could not parse MTU value '%s'"), NULLSTR(mtu_str));
+         goto error;
+     }
+     ifacedef->mtu = mtu;
+@@ -1105,7 +1117,7 @@ udevInterfaceIsActive(virInterfacePtr ifinfo)
+        goto cleanup;
+ 
+     /* Check if it's active or not */
+-    status = STREQ(udev_device_get_sysattr_value(dev, "operstate"), "up");
++    status = STREQ_NULLABLE(udev_device_get_sysattr_value(dev, "operstate"), 
"up");
+ 
+     udev_device_unref(dev);
+ 
diff -Nru libvirt-7.0.0/debian/patches/libxl-Fix-domain-shutdown.patch 
libvirt-7.0.0/debian/patches/libxl-Fix-domain-shutdown.patch
--- libvirt-7.0.0/debian/patches/libxl-Fix-domain-shutdown.patch        
1970-01-01 01:00:00.000000000 +0100
+++ libvirt-7.0.0/debian/patches/libxl-Fix-domain-shutdown.patch        
2024-07-30 21:35:28.000000000 +0200
@@ -0,0 +1,226 @@
+From: Jim Fehlig <jfeh...@suse.com>
+Date: Fri, 19 Feb 2021 16:29:10 -0700
+Subject: libxl: Fix domain shutdown
+
+Commit fa30ee04a2 caused a regression in normal domain shutown.
+Initiating a shutdown from within the domain or via 'virsh shutdown'
+does cause the guest OS running in the domain to shutdown, but libvirt
+never reaps the domain so it is always shown in a running state until
+calling 'virsh destroy'.
+
+The shutdown thread is also an internal user of the driver shutdown
+machinery and eventually calls libxlDomainDestroyInternal where
+the ignoreDeathEvent inhibitor is set, but running in a thread
+introduces the possibility of racing with the death event from
+libxl. This can be prevented by setting ignoreDeathEvent before
+running the shutdown thread.
+
+An additional improvement is to handle the destroy event synchronously
+instead of spawning a thread. The time consuming aspects of destroying
+a domain have been completed when the destroy event is delivered.
+
+Signed-off-by: Jim Fehlig <jfeh...@suse.com>
+Reviewed-by: Michal Privoznik <mpriv...@redhat.com>
+Origin: 
https://gitlab.com/libvirt/libvirt/-/commit/87a9d3a6b01baebdca33d95ad0e79781b6a46ca8
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2034195
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2021-4147
+Bug-Debian: https://bugs.debian.org/1002535
+---
+ src/libxl/libxl_domain.c | 120 ++++++++++++++++++++++-------------------------
+ 1 file changed, 57 insertions(+), 63 deletions(-)
+
+diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
+index afa21bf..63938d5 100644
+--- a/src/libxl/libxl_domain.c
++++ b/src/libxl/libxl_domain.c
+@@ -476,6 +476,7 @@ libxlDomainShutdownHandleRestart(libxlDriverPrivatePtr 
driver,
+ struct libxlShutdownThreadInfo
+ {
+     libxlDriverPrivatePtr driver;
++    virDomainObjPtr vm;
+     libxl_event *event;
+ };
+ 
+@@ -484,7 +485,7 @@ static void
+ libxlDomainShutdownThread(void *opaque)
+ {
+     struct libxlShutdownThreadInfo *shutdown_info = opaque;
+-    virDomainObjPtr vm = NULL;
++    virDomainObjPtr vm = shutdown_info->vm;
+     libxl_event *ev = shutdown_info->event;
+     libxlDriverPrivatePtr driver = shutdown_info->driver;
+     virObjectEventPtr dom_event = NULL;
+@@ -494,12 +495,6 @@ libxlDomainShutdownThread(void *opaque)
+ 
+     libxl_domain_config_init(&d_config);
+ 
+-    vm = virDomainObjListFindByID(driver->domains, ev->domid);
+-    if (!vm) {
+-        VIR_INFO("Received event for unknown domain ID %d", ev->domid);
+-        goto cleanup;
+-    }
+-
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+         goto cleanup;
+ 
+@@ -616,32 +611,18 @@ libxlDomainShutdownThread(void *opaque)
+ }
+ 
+ static void
+-libxlDomainDeathThread(void *opaque)
++libxlDomainHandleDeath(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
+ {
+-    struct libxlShutdownThreadInfo *shutdown_info = opaque;
+-    virDomainObjPtr vm = NULL;
+-    libxl_event *ev = shutdown_info->event;
+-    libxlDriverPrivatePtr driver = shutdown_info->driver;
+     virObjectEventPtr dom_event = NULL;
+-    g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
+-    libxlDomainObjPrivatePtr priv;
+-
+-    vm = virDomainObjListFindByID(driver->domains, ev->domid);
+-    if (!vm) {
+-        /* vm->def->id already cleared, means the death was handled by the
+-         * driver already */
+-        goto cleanup;
+-    }
+-
+-    priv = vm->privateData;
++    libxlDomainObjPrivatePtr priv = vm->privateData;
+ 
+     if (priv->ignoreDeathEvent) {
+         priv->ignoreDeathEvent = false;
+-        goto cleanup;
++        return;
+     }
+ 
+     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
+-        goto cleanup;
++        return;
+ 
+     virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, 
VIR_DOMAIN_SHUTOFF_DESTROYED);
+     dom_event = virDomainEventLifecycleNewFromObj(vm,
+@@ -651,12 +632,7 @@ libxlDomainDeathThread(void *opaque)
+     if (!vm->persistent)
+         virDomainObjListRemove(driver->domains, vm);
+     libxlDomainObjEndJob(driver, vm);
+-
+- cleanup:
+-    virDomainObjEndAPI(&vm);
+     virObjectEventStateQueue(driver->domainEventState, dom_event);
+-    libxl_event_free(cfg->ctx, ev);
+-    VIR_FREE(shutdown_info);
+ }
+ 
+ 
+@@ -668,16 +644,13 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+ {
+     libxlDriverPrivatePtr driver = data;
+     libxl_shutdown_reason xl_reason = 
event->u.domain_shutdown.shutdown_reason;
+-    struct libxlShutdownThreadInfo *shutdown_info = NULL;
+-    virThread thread;
++    virDomainObjPtr vm = NULL;
+     g_autoptr(libxlDriverConfig) cfg = NULL;
+-    int ret = -1;
+-    g_autofree char *name = NULL;
+ 
+     if (event->type != LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN &&
+             event->type != LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
+         VIR_INFO("Unhandled event type %d", event->type);
+-        goto error;
++        goto cleanup;
+     }
+ 
+     /*
+@@ -685,42 +658,63 @@ libxlDomainEventHandler(void *data, 
VIR_LIBXL_EVENT_CONST libxl_event *event)
+      * after calling libxl_domain_suspend() are handled by its callers.
+      */
+     if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
+-        goto error;
++        goto cleanup;
++
++    vm = virDomainObjListFindByID(driver->domains, event->domid);
++    if (!vm) {
++        /* Nothing to do if we can't find the virDomainObj */
++        goto cleanup;
++    }
++
++    if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
++        libxlDomainObjPrivatePtr priv = vm->privateData;
++        struct libxlShutdownThreadInfo *shutdown_info = NULL;
++        virThread thread;
++        g_autofree char *name = NULL;
+ 
+-    /*
+-     * Start a thread to handle shutdown.  We don't want to be tying up
+-     * libxl's event machinery by doing a potentially lengthy shutdown.
+-     */
+-    shutdown_info = g_new0(struct libxlShutdownThreadInfo, 1);
+-
+-    shutdown_info->driver = driver;
+-    shutdown_info->event = (libxl_event *)event;
+-    name = g_strdup_printf("ev-%d", event->domid);
+-    if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN)
+-        ret = virThreadCreateFull(&thread, false, libxlDomainShutdownThread,
+-                                  name, false, shutdown_info);
+-    else if (event->type == LIBXL_EVENT_TYPE_DOMAIN_DEATH)
+-        ret = virThreadCreateFull(&thread, false, libxlDomainDeathThread,
+-                                  name, false, shutdown_info);
+-
+-    if (ret < 0) {
+         /*
+-         * Not much we can do on error here except log it.
++         * Start a thread to handle shutdown.  We don't want to be tying up
++         * libxl's event machinery by doing a potentially lengthy shutdown.
+          */
+-        VIR_ERROR(_("Failed to create thread to handle domain shutdown"));
+-        goto error;
+-    }
++        shutdown_info = g_new0(struct libxlShutdownThreadInfo, 1);
+ 
+-    /*
+-     * libxlShutdownThreadInfo and libxl_event are freed in shutdown thread
+-     */
+-    return;
++        shutdown_info->driver = driver;
++        shutdown_info->vm = vm;
++        shutdown_info->event = (libxl_event *)event;
++        name = g_strdup_printf("ev-%d", event->domid);
++        /*
++         * Cleanup will be handled by the shutdown thread.
++         * Ignore the forthcoming death event from libxl
++         */
++        priv->ignoreDeathEvent = true;
++        if (virThreadCreateFull(&thread, false, libxlDomainShutdownThread,
++                                name, false, shutdown_info) < 0) {
++             priv->ignoreDeathEvent = false;
++            /*
++             * Not much we can do on error here except log it.
++             */
++            VIR_ERROR(_("Failed to create thread to handle domain shutdown"));
++            VIR_FREE(shutdown_info);
++            goto cleanup;
++        }
++        /*
++         * virDomainObjEndAPI is called in the shutdown thread, where
++         * libxlShutdownThreadInfo and libxl_event are also freed.
++         */
++        return;
++    } else if (event->type == LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
++        /*
++         * On death the domain is cleaned up from Xen's perspective.
++         * Cleanup on the libvirt side can be done synchronously.
++         */
++        libxlDomainHandleDeath(driver, vm);
++    }
+ 
+- error:
++ cleanup:
++    virDomainObjEndAPI(&vm);
+     cfg = libxlDriverConfigGet(driver);
+     /* Cast away any const */
+     libxl_event_free(cfg->ctx, (libxl_event *)event);
+-    VIR_FREE(shutdown_info);
+ }
+ 
+ char *
diff -Nru libvirt-7.0.0/debian/patches/series 
libvirt-7.0.0/debian/patches/series
--- libvirt-7.0.0/debian/patches/series 2023-02-06 17:49:16.000000000 +0100
+++ libvirt-7.0.0/debian/patches/series 2024-07-30 21:35:28.000000000 +0200
@@ -15,3 +15,17 @@
 backport/vircgroup-Fix-virCgroupKillRecursive-wrt-nested-controlle.patch
 backport/tests-Fix-libxlxml2domconfigtest-with-latest-xen.patch
 backport/tests-Fix-libxlxml2domconfigtest.patch
+CVE-2021-3631.patch
+CVE-2021-3667.patch
+CVE-2021-3975.patch
+libxl-Fix-domain-shutdown.patch
+CVE-2021-4147_1.patch
+CVE-2021-4147_2.patch
+CVE-2021-4147_3.patch
+CVE-2021-4147_4.patch
+CVE-2021-4147_5.patch
+CVE-2021-4147_6.patch
+CVE-2022-0897.patch
+CVE-2024-1441.patch
+CVE-2024-2496.patch
+CVE-2024-2494.patch

Attachment: signature.asc
Description: PGP signature


--- End Message ---
--- Begin Message ---
Package: release.debian.org
Version: 11.11

Hi,

Each of these bugs relates to an update including in today's final
bullseye 11.11 point release.

Regards,

Adam

--- End Message ---

Reply via email to