[libvirt] [PATCH] fix error when parsing ppc64 models on x86 host

When parsing ppc64 models on an x86 host an out-of-memory error message is displayed due to it checking for retcpus being NULL. Fix this by removing the check whether retcpus is NULL since we will realloc into this variable. Also in the X86 model parser display the OOM error at the location where it happens. --- src/qemu/qemu_capabilities.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) Index: libvirt-iterator/src/qemu/qemu_capabilities.c =================================================================== --- libvirt-iterator.orig/src/qemu/qemu_capabilities.c +++ libvirt-iterator/src/qemu/qemu_capabilities.c @@ -443,8 +443,10 @@ qemuCapsParseX86Models(const char *outpu if (retcpus) { unsigned int len; - if (VIR_REALLOC_N(cpus, count + 1) < 0) + if (VIR_REALLOC_N(cpus, count + 1) < 0) { + virReportOOMError(); goto error; + } if (next) len = next - p - 1; @@ -456,8 +458,10 @@ qemuCapsParseX86Models(const char *outpu len -= 2; } - if (!(cpus[count] = strndup(p, len))) + if (!(cpus[count] = strndup(p, len))) { + virReportOOMError(); goto error; + } } count++; } while ((p = next)); @@ -493,11 +497,6 @@ qemuCapsParsePPCModels(const char *outpu const char **cpus = NULL; int i; - if (!retcpus) { - VIR_DEBUG("No retcpus specified"); - return -1; - } - do { const char *t; @@ -587,10 +586,8 @@ qemuCapsProbeCPUModels(const char *qemu, if (virCommandRun(cmd, NULL) < 0) goto cleanup; - if (parse(output, count, cpus) < 0) { - virReportOOMError(); + if (parse(output, count, cpus) < 0) goto cleanup; - } ret = 0;

On 12/09/2011 07:27 AM, Stefan Berger wrote:
When parsing ppc64 models on an x86 host an out-of-memory error message is displayed due to it checking for retcpus being NULL. Fix this by removing the check whether retcpus is NULL since we will realloc into this variable. Also in the X86 model parser display the OOM error at the location where it happens.
@@ -493,11 +497,6 @@ qemuCapsParsePPCModels(const char *outpu const char **cpus = NULL; int i;
- if (!retcpus) { - VIR_DEBUG("No retcpus specified"); - return -1; - }
This hunk looks okay, but your patch is incomplete; later on, we have: if (retcount) *retcount = count; if (retcpus) *retcpus = cpus; return 0; error: if (cpus) { for (i = 0; i < count; i++) VIR_FREE(cpus[i]); } VIR_FREE(cpus); return -1; What this really needs to be is: if (retcpus) { *retcpus = cpus; cpus = NULL; } ret = 0; cleanup: if (cpus) { ... } VIR_FREE(cpus); return ret; so that we don't leak cpus when retcpus is NULL. Looking forward to v2. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (2)
-
Eric Blake
-
Stefan Berger