提交 ffa9f8a1 编写于 作者: J John Ferlan

qemu: Fix possible memory leak in qemuDomainPinVcpuFlags

During his review of the iothreads pin setting code, Pavel noted that
there was a potential memory leak with respect to how the newVcpuPin
is handled and the goto endjob's in failure paths which would not free
the memory.  For reference, See:

http://www.redhat.com/archives/libvir-list/2015-March/msg00415.html
上级 4bca6192
...@@ -5123,10 +5123,10 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, ...@@ -5123,10 +5123,10 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
newVcpuPinNum = 0; newVcpuPinNum = 0;
} }
if (virDomainVcpuPinAdd(&newVcpuPin, &newVcpuPinNum, cpumap, maplen, vcpu) < 0) { if (virDomainVcpuPinAdd(&newVcpuPin, &newVcpuPinNum,
cpumap, maplen, vcpu) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to update vcpupin")); _("failed to update vcpupin"));
virDomainVcpuPinDefArrayFree(newVcpuPin, newVcpuPinNum);
goto endjob; goto endjob;
} }
...@@ -5134,7 +5134,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, ...@@ -5134,7 +5134,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) { if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
if (virCgroupNewVcpu(priv->cgroup, vcpu, false, &cgroup_vcpu) < 0) if (virCgroupNewVcpu(priv->cgroup, vcpu, false, &cgroup_vcpu) < 0)
goto endjob; goto endjob;
if (qemuSetupCgroupVcpuPin(cgroup_vcpu, newVcpuPin, newVcpuPinNum, vcpu) < 0) { if (qemuSetupCgroupVcpuPin(cgroup_vcpu, newVcpuPin, newVcpuPinNum,
vcpu) < 0) {
virReportError(VIR_ERR_OPERATION_INVALID, virReportError(VIR_ERR_OPERATION_INVALID,
_("failed to set cpuset.cpus in cgroup" _("failed to set cpuset.cpus in cgroup"
" for vcpu %d"), vcpu); " for vcpu %d"), vcpu);
...@@ -5153,16 +5154,14 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, ...@@ -5153,16 +5154,14 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
virDomainVcpuPinDel(vm->def, vcpu); virDomainVcpuPinDel(vm->def, vcpu);
} else { } else {
if (vm->def->cputune.vcpupin) if (vm->def->cputune.vcpupin)
virDomainVcpuPinDefArrayFree(vm->def->cputune.vcpupin, vm->def->cputune.nvcpupin); virDomainVcpuPinDefArrayFree(vm->def->cputune.vcpupin,
vm->def->cputune.nvcpupin);
vm->def->cputune.vcpupin = newVcpuPin; vm->def->cputune.vcpupin = newVcpuPin;
vm->def->cputune.nvcpupin = newVcpuPinNum; vm->def->cputune.nvcpupin = newVcpuPinNum;
newVcpuPin = NULL; newVcpuPin = NULL;
} }
if (newVcpuPin)
virDomainVcpuPinDefArrayFree(newVcpuPin, newVcpuPinNum);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
goto endjob; goto endjob;
...@@ -5211,6 +5210,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, ...@@ -5211,6 +5210,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
if (newVcpuPin)
virDomainVcpuPinDefArrayFree(newVcpuPin, newVcpuPinNum);
if (cgroup_vcpu) if (cgroup_vcpu)
virCgroupFree(&cgroup_vcpu); virCgroupFree(&cgroup_vcpu);
qemuDomObjEndAPI(&vm); qemuDomObjEndAPI(&vm);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册