From 65e1b4fd266d903e0cde71643692061c20e7f273 Mon Sep 17 00:00:00 2001 From: Matt Coleman Date: Thu, 14 Jan 2021 08:03:32 -0500 Subject: [PATCH] hyperv: ambiguous VM names will throw an error Since Hyper-V allows multiple VMs to be created with the same name, some commands produce unpredictable results due to hypervDomainLookupByName's WMI query selecting the wrong domain. For example, this prevents `virsh dumpxml` from outputting XML for the wrong domain. Signed-off-by: Matt Coleman Reviewed-by: Michal Privoznik --- include/libvirt/virterror.h | 1 + src/hyperv/hyperv_driver.c | 7 +++++++ src/util/virerror.c | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h index b96fe250aa..524a7bf9e8 100644 --- a/include/libvirt/virterror.h +++ b/include/libvirt/virterror.h @@ -333,6 +333,7 @@ typedef enum { VIR_ERR_NO_NETWORK_PORT = 107, /* network port not found */ VIR_ERR_NO_HOSTNAME = 108, /* no domain's hostname found */ VIR_ERR_CHECKPOINT_INCONSISTENT = 109, /* checkpoint can't be used */ + VIR_ERR_MULTIPLE_DOMAINS = 110, /* more than one matching domain found */ # ifdef VIR_ENUM_SENTINELS VIR_ERR_NUMBER_LAST diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 1200bf02ff..2e18ef6691 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -1118,6 +1118,13 @@ hypervDomainLookupByName(virConnectPtr conn, const char *name) if (hypervGetVirtualSystemByName(priv, name, &computerSystem) < 0) goto cleanup; + if (computerSystem->next) { + virReportError(VIR_ERR_MULTIPLE_DOMAINS, + _("Multiple domains exist with the name '%s': repeat the request using a UUID"), + name); + goto cleanup; + } + hypervMsvmComputerSystemToDomain(conn, computerSystem, &domain); cleanup: diff --git a/src/util/virerror.c b/src/util/virerror.c index 9e3bad97eb..14054add41 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -1229,8 +1229,10 @@ static const virErrorMsgTuple virErrorMsgStrings[] = { N_("no hostname found: %s") }, [VIR_ERR_CHECKPOINT_INCONSISTENT] = { N_("checkpoint inconsistent"), - N_("checkpoint inconsistent: %s") - }, + N_("checkpoint inconsistent: %s") }, + [VIR_ERR_MULTIPLE_DOMAINS] = { + N_("multiple matching domains found"), + N_("multiple matching domains found: %s") }, }; G_STATIC_ASSERT(G_N_ELEMENTS(virErrorMsgStrings) == VIR_ERR_NUMBER_LAST);