From 99026fd0ad4fb962cc1c95c9a310ee7af79788ae Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Fri, 15 Jul 2016 07:27:48 -0400 Subject: [PATCH] qemu: Alter error path cleanup for qemuDomainAttachMemory A recent adjustment to qemuDomainAttachRNGDevice to properly cleanup the props object after a qemuMonitorAddObject also would affect this code. Alter the cleanup to be similar to RNG changes. --- src/qemu/qemu_hotplug.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 5ac42a7383..f7cc13f977 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1707,16 +1707,19 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, virDomainMemoryDefPtr mem) { qemuDomainObjPrivatePtr priv = vm->privateData; + virErrorPtr orig_err; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); unsigned long long oldmem = virDomainDefGetMemoryTotal(vm->def); unsigned long long newmem = oldmem + mem->size; char *devstr = NULL; char *objalias = NULL; const char *backendType; + bool objAdded = false; virJSONValuePtr props = NULL; virObjectEventPtr event; int id; int ret = -1; + int rv; qemuDomainMemoryDeviceAlignSize(vm->def, mem); @@ -1749,16 +1752,14 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, } qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorAddObject(priv->mon, backendType, objalias, props) < 0) + rv = qemuMonitorAddObject(priv->mon, backendType, objalias, props); + props = NULL; /* qemuMonitorAddObject consumes */ + if (rv < 0) goto exit_monitor; + objAdded = true; - if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { - virErrorPtr err = virSaveLastError(); - ignore_value(qemuMonitorDelObject(priv->mon, objalias)); - virSetError(err); - virFreeError(err); + if (qemuMonitorAddDevice(priv->mon, devstr) < 0) goto exit_monitor; - } if (qemuDomainObjExitMonitor(driver, vm) < 0) { /* we shouldn't touch mem now, as the def might be freed */ @@ -1791,6 +1792,13 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, return ret; exit_monitor: + orig_err = virSaveLastError(); + if (objAdded) + ignore_value(qemuMonitorDelObject(priv->mon, objalias)); + if (orig_err) { + virSetError(orig_err); + virFreeError(orig_err); + } if (qemuDomainObjExitMonitor(driver, vm) < 0) { mem = NULL; goto audit; @@ -1803,10 +1811,10 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, mem = NULL; /* reset the mlock limit */ - virErrorPtr err = virSaveLastError(); + orig_err = virSaveLastError(); ignore_value(qemuDomainAdjustMaxMemLock(vm)); - virSetError(err); - virFreeError(err); + virSetError(orig_err); + virFreeError(orig_err); goto audit; }