From 1db124475232bf024ae7464b48f69150723c6af6 Mon Sep 17 00:00:00 2001 From: Kirill Shchetiniuk Date: Fri, 14 Mar 2025 12:51:18 +0100 Subject: [PATCH] ch: preserve last error in virCHProcessStop() If starting a CH domain fails an error is reported and virCHProcessStart() calls virCHProcessStop() to clean up any residues. Problem is, inside of virCHProcessStop() some public APIs might be called (e.g. virNetworkLookupByName(), virNetworkPortLookupByUUID() and/or virNetworkPortDelete()). Per our design, public APIs reset last error which means the useful error reported earlier is lost. Fix this by calling virErrorPreserveLast() + virErrorRestore() combo inside of virCHProcessStop(). Signed-off-by: Kirill Shchetiniuk Reviewed-by: Michal Privoznik --- src/ch/ch_process.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index ee86430e08..b3eddd61e8 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -999,11 +999,14 @@ virCHProcessStop(virCHDriver *driver, unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI; virCHDomainObjPrivate *priv = vm->privateData; virDomainDef *def = vm->def; + virErrorPtr orig_err = NULL; size_t i; VIR_DEBUG("Stopping VM name=%s pid=%d reason=%d", vm->def->name, (int)vm->pid, (int)reason); + virErrorPreserveLast(&orig_err); + if (priv->monitor) { g_clear_pointer(&priv->monitor, virCHMonitorClose); } @@ -1036,6 +1039,8 @@ virCHProcessStop(virCHDriver *driver, virHostdevReAttachDomainDevices(driver->hostdevMgr, CH_DRIVER_NAME, def, hostdev_flags); + + virErrorRestore(&orig_err); return 0; }