[libvirt] [PATCH 0/2] qemu: Fix memleak in qemuBuildNumaArgStr

*** BLURB HERE *** Michal Privoznik (2): qemu: Fix memleak in qemuBuildNumaArgStr qemuBuildNumaArgStr: Simplify @nodeBackends src/qemu/qemu_command.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) -- 2.16.4

We are allocating each individual buffer in @nodeBackends array but never free it. ==22516== 96 bytes in 4 blocks are definitely lost in loss record 166 of 195 ==22516== at 0x4C2EF26: calloc (vg_replace_malloc.c:711) ==22516== by 0x5D2C7D5: virAlloc (viralloc.c:144) ==22516== by 0x56FAABD: qemuBuildNumaArgStr (qemu_command.c:7543) ==22516== by 0x5701835: qemuBuildCommandLine (qemu_command.c:10112) ==22516== by 0x575D794: qemuProcessCreatePretendCmd (qemu_process.c:6568) ==22516== by 0x113338: testCompareXMLToArgv (qemuxml2argvtest.c:549) ==22516== by 0x138CA3: virTestRun (testutils.c:180) ==22516== by 0x136CD1: mymain (qemuxml2argvtest.c:2825) ==22516== by 0x13AD58: virTestMain (testutils.c:1118) ==22516== by 0x137351: main (qemuxml2argvtest.c:2874) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e85c5ef804..fb5bb26ad1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7641,8 +7641,10 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, VIR_FREE(cpumask); if (nodeBackends) { - for (i = 0; i < ncells; i++) + for (i = 0; i < ncells; i++) { virBufferFreeAndReset(nodeBackends[i]); + VIR_FREE(nodeBackends[i]); + } VIR_FREE(nodeBackends); } -- 2.16.4

Instead of array of pointers to individual buffers it can be array of buffers directly. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fb5bb26ad1..1324c672ba 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7478,7 +7478,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, virQEMUCapsPtr qemuCaps = priv->qemuCaps; virBuffer buf = VIR_BUFFER_INITIALIZER; char *cpumask = NULL, *tmpmask = NULL, *next = NULL; - virBufferPtr *nodeBackends = NULL; + virBufferPtr nodeBackends = NULL; bool needBackend = false; int rc; int ret = -1; @@ -7540,11 +7540,8 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) || virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { - if (VIR_ALLOC(nodeBackends[i]) < 0) - goto cleanup; - if ((rc = qemuBuildMemoryCellBackendStr(def, cfg, i, priv, - nodeBackends[i])) < 0) + &nodeBackends[i])) < 0) goto cleanup; if (rc == 0) @@ -7578,7 +7575,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, if (needBackend) { virCommandAddArg(cmd, "-object"); - virCommandAddArgBuffer(cmd, nodeBackends[i]); + virCommandAddArgBuffer(cmd, &nodeBackends[i]); } virCommandAddArg(cmd, "-numa"); @@ -7641,10 +7638,8 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, VIR_FREE(cpumask); if (nodeBackends) { - for (i = 0; i < ncells; i++) { - virBufferFreeAndReset(nodeBackends[i]); - VIR_FREE(nodeBackends[i]); - } + for (i = 0; i < ncells; i++) + virBufferFreeAndReset(&nodeBackends[i]); VIR_FREE(nodeBackends); } -- 2.16.4

On Wed, Jun 06, 2018 at 13:13:14 +0200, Michal Privoznik wrote:
Instead of array of pointers to individual buffers it can be array of buffers directly.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
ACK to this version.
participants (2)
-
Michal Privoznik
-
Peter Krempa