]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuSnapshotRevertInactive: Ensure all error paths handle transient domains properly
authorPeter Krempa <pkrempa@redhat.com>
Thu, 15 May 2025 14:12:31 +0000 (16:12 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 16 May 2025 12:48:20 +0000 (14:48 +0200)
Only the internal snapshot code paths were able to handle transient
domains properly in case when startup of the process failed.

Unify the error paths on an 'error' label with proper handling.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_snapshot.c

index 6926d1a0e4593fb61b76b510b782e94d03401715..b66b83e230815429174e071eeb912c0786ccf295 100644 (file)
@@ -2773,24 +2773,20 @@ qemuSnapshotRevertInactive(virDomainObj *vm,
 
     if (virDomainSnapshotIsExternal(snap)) {
         if (!(tmpsnapdef = virDomainSnapshotDefNew()))
-            return -1;
+            goto error;
 
         if (qemuSnapshotRevertExternalPrepare(vm, tmpsnapdef, snap,
-                                              NULL, *inactiveConfig, NULL) < 0) {
-            return -1;
-        }
+                                              NULL, *inactiveConfig, NULL) < 0)
+            goto error;
 
         if (qemuSnapshotRevertExternalInactive(tmpsnapdef,
-                                               *inactiveConfig) < 0) {
-            return -1;
-        }
+                                               *inactiveConfig) < 0)
+            goto error;
 
         qemuSnapshotRevertExternalFinish(vm, tmpsnapdef, snap);
     } else {
-        if (qemuSnapshotInternalRevertInactive(vm, snap) < 0) {
-            qemuDomainRemoveInactive(driver, vm, 0, false);
-            return -1;
-        }
+        if (qemuSnapshotInternalRevertInactive(vm, snap) < 0)
+            goto error;
     }
 
     if (*inactiveConfig) {
@@ -2810,10 +2806,9 @@ qemuSnapshotRevertInactive(virDomainObj *vm,
                               NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
                               start_flags);
         virDomainAuditStart(vm, "from-snapshot", rc >= 0);
-        if (rc < 0) {
-            qemuDomainRemoveInactive(driver, vm, 0, false);
-            return -1;
-        }
+        if (rc < 0)
+            goto error;
+
         detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
         event = virDomainEventLifecycleNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_STARTED,
@@ -2829,6 +2824,12 @@ qemuSnapshotRevertInactive(virDomainObj *vm,
     }
 
     return qemuSnapshotRevertWriteMetadata(vm, snap, driver, cfg, defined);
+
+ error:
+    if (!virDomainObjIsActive(vm))
+        qemuDomainRemoveInactive(driver, vm, 0, false);
+
+    return -1;
 }