1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

qemu: Fix mem leak in qemuProcessInitCpuAffinity

If placement mode is AUTO, on some return paths char *cpumap or
char *nodeset are leaked.
This commit is contained in:
Michal Privoznik 2012-04-13 10:53:17 +02:00
parent 26e9ef4762
commit 354e6d4ed0

View File

@ -1796,6 +1796,7 @@ static int
qemuProcessInitCpuAffinity(struct qemud_driver *driver, qemuProcessInitCpuAffinity(struct qemud_driver *driver,
virDomainObjPtr vm) virDomainObjPtr vm)
{ {
int ret = -1;
int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN; int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
virNodeInfo nodeinfo; virNodeInfo nodeinfo;
unsigned char *cpumap; unsigned char *cpumap;
@ -1824,19 +1825,21 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
nodeset = qemuGetNumadAdvice(vm->def); nodeset = qemuGetNumadAdvice(vm->def);
if (!nodeset) if (!nodeset)
return -1; goto cleanup;
if (VIR_ALLOC_N(tmp_cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) { if (VIR_ALLOC_N(tmp_cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
virReportOOMError(); virReportOOMError();
return -1; VIR_FREE(nodeset);
goto cleanup;
} }
if (virDomainCpuSetParse(nodeset, 0, tmp_cpumask, if (virDomainCpuSetParse(nodeset, 0, tmp_cpumask,
VIR_DOMAIN_CPUMASK_LEN) < 0) { VIR_DOMAIN_CPUMASK_LEN) < 0) {
VIR_FREE(tmp_cpumask); VIR_FREE(tmp_cpumask);
VIR_FREE(nodeset); VIR_FREE(nodeset);
return -1; goto cleanup;
} }
VIR_FREE(nodeset);
for (i = 0; i < maxcpu && i < VIR_DOMAIN_CPUMASK_LEN; i++) { for (i = 0; i < maxcpu && i < VIR_DOMAIN_CPUMASK_LEN; i++) {
if (tmp_cpumask[i]) if (tmp_cpumask[i])
@ -1849,7 +1852,6 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
VIR_WARN("Unable to save status on vm %s after state change", VIR_WARN("Unable to save status on vm %s after state change",
vm->def->name); vm->def->name);
} }
VIR_FREE(nodeset);
} else { } else {
if (vm->def->cpumask) { if (vm->def->cpumask) {
/* XXX why don't we keep 'cpumask' in the libvirt cpumap /* XXX why don't we keep 'cpumask' in the libvirt cpumap
@ -1872,13 +1874,14 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
* running at this point * running at this point
*/ */
if (virProcessInfoSetAffinity(0, /* Self */ if (virProcessInfoSetAffinity(0, /* Self */
cpumap, cpumaplen, maxcpu) < 0) { cpumap, cpumaplen, maxcpu) < 0)
VIR_FREE(cpumap); goto cleanup;
return -1;
}
VIR_FREE(cpumap);
return 0; ret = 0;
cleanup:
VIR_FREE(cpumap);
return ret;
} }
/* set link states to down on interfaces at qemu start */ /* set link states to down on interfaces at qemu start */