From ba354048b8bbae13d48f2adde0224c6bd8c5a708 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A1n=20Tomko?= Date: Wed, 19 Mar 2014 17:13:19 +0100 Subject: [PATCH] Fix virQEMUCapsLoadCache leaks Valgrind reported leaking of maxCpus and arch strings from virXPathString, as well as the leak of the machineMaxCpus array. Don't use 'str' for the strings we don't want to free, to allow freeing of 'str' in the cleanup label and free machineMaxCpus in virCapsReset too. --- src/qemu/qemu_capabilities.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 29142002c8..c71bf6075c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2376,7 +2376,7 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, int n; xmlNodePtr *nodes = NULL; xmlXPathContextPtr ctxt = NULL; - char *str; + char *str = NULL; long long int l; if (!(doc = virXMLParseFile(filename))) @@ -2432,7 +2432,6 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, if (flag < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown qemu capabilities flag %s"), str); - VIR_FREE(str); goto cleanup; } VIR_FREE(str); @@ -2463,6 +2462,7 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, _("unknown arch %s in QEMU capabilities cache"), str); goto cleanup; } + VIR_FREE(str); if ((n = virXPathNodeSet("./cpu", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -2476,12 +2476,11 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, goto cleanup; for (i = 0; i < n; i++) { - if (!(str = virXMLPropString(nodes[i], "name"))) { + if (!(qemuCaps->cpuDefinitions[i] = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing cpu name in QEMU capabilities cache")); goto cleanup; } - qemuCaps->cpuDefinitions[i] = str; } } VIR_FREE(nodes); @@ -2503,13 +2502,11 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, goto cleanup; for (i = 0; i < n; i++) { - if (!(str = virXMLPropString(nodes[i], "name"))) { + if (!(qemuCaps->machineTypes[i] = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing machine name in QEMU capabilities cache")); goto cleanup; } - qemuCaps->machineTypes[i] = str; - qemuCaps->machineAliases[i] = virXMLPropString(nodes[i], "alias"); str = virXMLPropString(nodes[i], "maxCpus"); @@ -2519,12 +2516,14 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename, _("malformed machine cpu count in QEMU capabilities cache")); goto cleanup; } + VIR_FREE(str); } } VIR_FREE(nodes); ret = 0; - cleanup: +cleanup: + VIR_FREE(str); VIR_FREE(nodes); xmlXPathFreeContext(ctxt); xmlFreeDoc(doc); @@ -2668,6 +2667,7 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps) } VIR_FREE(qemuCaps->machineTypes); VIR_FREE(qemuCaps->machineAliases); + VIR_FREE(qemuCaps->machineMaxCpus); qemuCaps->nmachineTypes = 0; } -- 2.47.2