提交 28427e6b 编写于 作者: P Peter Krempa

vbox: snapshot: Avoid memleaks in functions dealing with disk arrays

In virVBoxSnapshotConfRemoveFakeDisks and
virVBoxSnapshotConfDiskIsInMediaRegistry the disk array constructed from
all the disks would be leaked at the end of the function and on
allocation errors. Also the temporary disk list would be leaked.

Add a cleanup section and free the memory properly.

Found by coverity.
上级 ca9a94a0
......@@ -1473,28 +1473,38 @@ virVBoxSnapshotConfRemoveFakeDisks(virVBoxSnapshotConfMachinePtr machine)
size_t diskSize = 0;
virVBoxSnapshotConfHardDiskPtr *tempList = NULL;
virVBoxSnapshotConfHardDiskPtr *diskList = NULL;
if (VIR_ALLOC_N(diskList, 0) < 0)
return ret;
return -1;
for (i = 0; i < machine->mediaRegistry->ndisks; i++) {
tempSize = virVBoxSnapshotConfAllChildren(machine->mediaRegistry->disks[i], &tempList);
if (VIR_EXPAND_N(diskList, diskSize, tempSize) < 0)
return ret;
for (j = 0; j < tempSize; j++) {
goto cleanup;
for (j = 0; j < tempSize; j++)
diskList[diskSize - tempSize + j] = tempList[j];
}
VIR_FREE(tempList);
}
for (i = 0; i < diskSize; i++) {
if (strstr(diskList[i]->location, "fake") != NULL) {
if (virVBoxSnapshotConfRemoveHardDisk(machine->mediaRegistry, diskList[i]->uuid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to remove hard disk %s from media registry"),
diskList[i]->location);
return ret;
goto cleanup;
}
}
}
ret = 0;
cleanup:
VIR_FREE(diskList);
VIR_FREE(tempList);
return ret;
}
......@@ -1515,24 +1525,34 @@ virVBoxSnapshotConfDiskIsInMediaRegistry(virVBoxSnapshotConfMachinePtr machine,
size_t diskSize = 0;
virVBoxSnapshotConfHardDiskPtr *tempList = NULL;
virVBoxSnapshotConfHardDiskPtr *diskList = NULL;
if (VIR_ALLOC_N(diskList, 0) < 0)
return ret;
return -1;
for (i = 0; i < machine->mediaRegistry->ndisks; i++) {
tempSize = virVBoxSnapshotConfAllChildren(machine->mediaRegistry->disks[i], &tempList);
if (VIR_EXPAND_N(diskList, diskSize, tempSize) < 0)
return ret;
for (j = 0; j < tempSize; j++) {
goto cleanup;
for (j = 0; j < tempSize; j++)
diskList[diskSize - tempSize + j] = tempList[j];
}
VIR_FREE(tempList);
}
for (i = 0; i < diskSize; i++) {
if (STREQ(diskList[i]->location, location)) {
ret = 1;
return ret;
goto cleanup;
}
}
ret = 0;
cleanup:
VIR_FREE(diskList);
VIR_FREE(tempList);
return ret;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册