qemu: snapshot: Restructure control flow to detect errors sooner and work around compiler

Some compilers aren't happy when an automatically freed variable is used
just to free something (thus it's only assigned in the code):

When compiling qemuSnapshotDelete after recent commits they complain:

../src/qemu/qemu_snapshot.c:3153:61: error: variable 'delData' set but not used [-Werror,-Wunused-but-set-variable]
                g_autoslist(qemuSnapshotDeleteExternalData) delData = NULL;
                                                            ^

To work around the issue we can restructure the code which also has the
following semantic implications:
 - since qemuSnapshotDeleteExternalPrepare does validation we error out
   sooner than attempting to start the VM

 - we read the temporary variable at least in one code path

Fixes: 4a4d89a925
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Peter Krempa 2023-01-09 14:01:59 +01:00
parent bb80344fd0
commit 64366c0056

View File

@ -3146,12 +3146,13 @@ qemuSnapshotDelete(virDomainObj *vm,
if (virDomainSnapshotIsExternal(snap) && if (virDomainSnapshotIsExternal(snap) &&
!(flags & (VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN | !(flags & (VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN |
VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY))) { VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY))) {
g_autoslist(qemuSnapshotDeleteExternalData) tmpData = NULL;
externalData = qemuSnapshotDeleteExternalPrepare(vm, snap); /* this also serves as validation whether the snapshot can be deleted */
if (!(tmpData = qemuSnapshotDeleteExternalPrepare(vm, snap)))
goto endjob;
if (!virDomainObjIsActive(vm)) { if (!virDomainObjIsActive(vm)) {
g_autoslist(qemuSnapshotDeleteExternalData) delData = NULL;
if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNAPSHOT, if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNAPSHOT,
NULL, -1, NULL, NULL, NULL, -1, NULL, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_CREATE, VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
@ -3163,20 +3164,19 @@ qemuSnapshotDelete(virDomainObj *vm,
/* Call the prepare again as some data require that the VM is /* Call the prepare again as some data require that the VM is
* running to get everything we need. */ * running to get everything we need. */
delData = g_steal_pointer(&externalData); if (!(externalData = qemuSnapshotDeleteExternalPrepare(vm, snap)))
externalData = qemuSnapshotDeleteExternalPrepare(vm, snap); goto endjob;
} else { } else {
qemuDomainJobPrivate *jobPriv = vm->job->privateData; qemuDomainJobPrivate *jobPriv = vm->job->privateData;
externalData = g_steal_pointer(&tmpData);
/* If the VM is running we need to indicate that the async snapshot /* If the VM is running we need to indicate that the async snapshot
* job is snapshot delete job. */ * job is snapshot delete job. */
jobPriv->snapshotDelete = true; jobPriv->snapshotDelete = true;
qemuDomainSaveStatus(vm); qemuDomainSaveStatus(vm);
} }
if (!externalData)
goto endjob;
} }
} }