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
This commit is contained in:
Martin Pitt 2020-11-24 14:24:06 +01:00 committed by Cole Robinson
parent 19fc6c1708
commit 4d0e323227
1 changed files with 10 additions and 2 deletions

View File

@ -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),