diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7bde0e4187..e5fc29b708 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1267,6 +1267,35 @@ void qemuDomainObjExitRemote(virDomainObjPtr obj) } +virDomainDefPtr +qemuDomainDefCopy(virQEMUDriverPtr driver, + virDomainDefPtr src, + unsigned int flags) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + virDomainDefPtr ret = NULL; + virCapsPtr caps = NULL; + const char *xml = NULL; + + if (qemuDomainDefFormatBuf(driver, src, flags, &buf) < 0) + goto cleanup; + + xml = virBufferContentAndReset(&buf); + + if (!(caps = virQEMUDriverGetCapabilities(driver, false))) + goto cleanup; + + if (!(ret = virDomainDefParseString(xml, caps, driver->xmlopt, + QEMU_EXPECTED_VIRT_TYPES, + VIR_DOMAIN_XML_INACTIVE))) + goto cleanup; + +cleanup: + VIR_FREE(xml); + virObjectUnref(caps); + return ret; +} + int qemuDomainDefFormatBuf(virQEMUDriverPtr driver, virDomainDefPtr def, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 042e57d9a6..d0ae649406 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -241,6 +241,10 @@ void qemuDomainObjEnterRemote(virDomainObjPtr obj) void qemuDomainObjExitRemote(virDomainObjPtr obj) ATTRIBUTE_NONNULL(1); +virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver, + virDomainDefPtr src, + unsigned int flags); + int qemuDomainDefFormatBuf(virQEMUDriverPtr driver, virDomainDefPtr vm, unsigned int flags, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index cb24e2b8bf..53ad478c8a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4688,17 +4688,24 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, goto error; if (xmlin) { virDomainDefPtr def2 = NULL; + virDomainDefPtr newdef = NULL; if (!(def2 = virDomainDefParseString(xmlin, caps, driver->xmlopt, QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto error; - if (!virDomainDefCheckABIStability(def, def2)) { - virDomainDefFree(def2); + + newdef = qemuDomainDefCopy(driver, def2, VIR_DOMAIN_XML_MIGRATABLE); + virDomainDefFree(def2); + if (!newdef) + goto error; + + if (!virDomainDefCheckABIStability(def, newdef)) { + virDomainDefFree(newdef); goto error; } virDomainDefFree(def); - def = def2; + def = newdef; } VIR_FREE(xml);