]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Fix persistent migration of transient domains
authorJiri Denemark <jdenemar@redhat.com>
Tue, 2 May 2017 16:01:04 +0000 (18:01 +0200)
committerCole Robinson <crobinso@redhat.com>
Wed, 10 May 2017 22:02:39 +0000 (18:02 -0400)
While fixing a bug with incorrectly freed memory in commit
v3.1.0-399-g5498aa29a, I accidentally broke persistent migration of
transient domains. Before adding qemuDomainDefCopy in the path, the code
just took NULL from vm->newDef and used it as the persistent def, which
resulted in no persistent XML being sent in the migration cookie. This
scenario is perfectly valid and the destination correctly handles it by
using the incoming live definition and storing it as the persistent one.

After the mentioned commit libvirtd would just segfault in the described
scenario.

https://bugzilla.redhat.com/show_bug.cgi?id=1446205

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
(cherry picked from commit 59307fade86fb74db1f8f572433962233f7ac123)

src/qemu/qemu_migration.c

index 992b6bd4a237384216b56d85770cac1621f099d2..10517713e6ae2f6a0241dfd05950bf54d18b5f2b 100644 (file)
@@ -3620,15 +3620,15 @@ qemuMigrationRun(virQEMUDriverPtr driver,
 
     if (flags & VIR_MIGRATE_PERSIST_DEST) {
         if (persist_xml) {
-            persistDef = qemuMigrationPrepareDef(driver, persist_xml,
-                                                 NULL, NULL);
-        } else {
-            persistDef = qemuDomainDefCopy(driver, vm->newDef,
-                                           VIR_DOMAIN_XML_SECURE |
-                                           VIR_DOMAIN_XML_MIGRATABLE);
+            if (!(persistDef = qemuMigrationPrepareDef(driver, persist_xml,
+                                                       NULL, NULL)))
+                goto cleanup;
+        } else if (vm->newDef) {
+            if (!(persistDef = qemuDomainDefCopy(driver, vm->newDef,
+                                                 VIR_DOMAIN_XML_SECURE |
+                                                 VIR_DOMAIN_XML_MIGRATABLE)))
+                goto cleanup;
         }
-        if (!persistDef)
-            goto cleanup;
     }
 
     mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,