From 52737d0d3676305fdffc1db57dae8dd6fe71d83c Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Mon, 11 Jan 2021 13:41:11 -0500 Subject: [PATCH] virt-manager-3.2.0-2 Fix 'domain not found' race (bz #1901081) --- ...nst-Fix-TOCTOU-in-domain-enumeration.patch | 44 +++++++++++++++++++ virt-manager.spec | 8 +++- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 0001-virtinst-Fix-TOCTOU-in-domain-enumeration.patch diff --git a/0001-virtinst-Fix-TOCTOU-in-domain-enumeration.patch b/0001-virtinst-Fix-TOCTOU-in-domain-enumeration.patch new file mode 100644 index 0000000..f747754 --- /dev/null +++ b/0001-virtinst-Fix-TOCTOU-in-domain-enumeration.patch @@ -0,0 +1,44 @@ +From 4d0e323227f18e58283c45be4d240b506faacb22 Mon Sep 17 00:00:00 2001 +Message-Id: <4d0e323227f18e58283c45be4d240b506faacb22.1610390294.git.crobinso@redhat.com> +From: Martin Pitt +Date: Tue, 24 Nov 2020 14:24:06 +0100 +Subject: [PATCH virt-manager] virtinst: Fix TOCTOU in domain enumeration + +Similar to commit 49a01b5482, _fetch_all_domains_raw() has a race +condition where a domain may disappear (from parallel libvirt +operations) in between enumerating and inspecting the objects. + +Ignore these missing domains instead of crashing. + +https://bugzilla.redhat.com/show_bug.cgi?id=1901081 +Signed-off-by: Cole Robinson +--- + virtinst/connection.py | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/virtinst/connection.py b/virtinst/connection.py +index fec273b7..06bc60ad 100644 +--- a/virtinst/connection.py ++++ b/virtinst/connection.py +@@ -182,8 +182,16 @@ class VirtinstConnection(object): + def _fetch_all_domains_raw(self): + dummy1, dummy2, ret = pollhelpers.fetch_vms( + self, {}, lambda obj, ignore: obj) +- return [Guest(weakref.proxy(self), parsexml=obj.XMLDesc(0)) +- for obj in ret] ++ domains = [] ++ for obj in ret: ++ # TOCTOU race: a domain may go away in between enumeration and inspection ++ try: ++ xml = obj.XMLDesc(0) ++ except libvirt.libvirtError as e: # pragma: no cover ++ log.debug("Fetching domain XML failed: %s", e) ++ continue ++ domains.append(Guest(weakref.proxy(self), parsexml=xml)) ++ return domains + + def _build_pool_raw(self, poolobj): + return StoragePool(weakref.proxy(self), +-- +2.29.2 + diff --git a/virt-manager.spec b/virt-manager.spec index 724904b..a52930d 100644 --- a/virt-manager.spec +++ b/virt-manager.spec @@ -8,7 +8,7 @@ Name: virt-manager Version: 3.2.0 -Release: 1%{?dist} +Release: 2%{?dist} %global verrel %{version}-%{release} Summary: Desktop tool for managing virtual machines via libvirt @@ -17,6 +17,9 @@ BuildArch: noarch URL: https://virt-manager.org/ Source0: https://virt-manager.org/download/sources/%{name}/%{name}-%{version}.tar.gz +# Fix 'domain not found' race (bz #1901081) +Patch0001: 0001-virtinst-Fix-TOCTOU-in-domain-enumeration.patch + Requires: virt-manager-common = %{verrel} Requires: python3-gobject @@ -167,6 +170,9 @@ done %changelog +* Mon Jan 11 2021 Cole Robinson - 3.2.0-2 +- Fix 'domain not found' race (bz #1901081) + * Sat Nov 14 2020 Cole Robinson - 3.2.0-1 - Update to version 3.2.0 - Slim down filesystem device editor UI