From c4c44b535b474ef4a04bcc241bb24bb18d2a3a3d Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 26 Apr 2019 15:16:17 +0200 Subject: [PATCH] qemuDomainAttachDeviceLiveAndConfig: Don't overwrite @ret If we're attaching a device to both inactive and live XML then @ret is overwritten which may result in incorrect return value. For instance, if attaching to inactive XML succeeds, @ret is assigned value of zero and control proceeds to attaching the device to live XML. Here, if say virDomainDeviceValidateAliasForHotplug() fails the control jumps over to 'cleanup' label and zero is returned indicating success. Signed-off-by: Michal Privoznik --- src/qemu/qemu_driver.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 30fc335883..2b2d531441 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8652,9 +8652,9 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr vm, false) < 0) goto cleanup; - if ((ret = qemuDomainAttachDeviceConfig(vmdef, devConf, caps, - parse_flags, - driver->xmlopt)) < 0) + if (qemuDomainAttachDeviceConfig(vmdef, devConf, caps, + parse_flags, + driver->xmlopt) < 0) goto cleanup; } @@ -8671,28 +8671,27 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr vm, true) < 0) goto cleanup; - if ((ret = qemuDomainAttachDeviceLive(vm, devLive, driver)) < 0) + if (qemuDomainAttachDeviceLive(vm, devLive, driver) < 0) goto cleanup; /* * update domain status forcibly because the domain status may be * changed even if we failed to attach the device. For example, * a new controller may be created. */ - if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) { - ret = -1; + if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) goto cleanup; - } } /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); - if (!ret) { - virDomainObjAssignDef(vm, vmdef, false, NULL); - vmdef = NULL; - } + if (virDomainSaveConfig(cfg->configDir, driver->caps, vmdef) < 0) + goto cleanup; + + virDomainObjAssignDef(vm, vmdef, false, NULL); + vmdef = NULL; } + ret = 0; cleanup: virDomainDefFree(vmdef); virDomainDeviceDefFree(devConf); -- GitLab