[libvirt] [PATCH 1/2] qemu: caps: Fix segfault on daemon startup
Cole Robinson
crobinso at redhat.com
Fri Jan 27 21:02:07 UTC 2012
On 01/27/2012 03:57 PM, Eric Blake wrote:
> On 01/27/2012 11:34 AM, Cole Robinson wrote:
>> On my f16 box at least, this tries to free p unconditionally which isn't
>> always okay, 'p' is freeable only under a limited scope.
>
> You must not have yajl-devel installed. No wonder I didn't see that I
> had introduced a regression.
>
>> ---
>> src/qemu/qemu_capabilities.c | 3 +--
>> 1 files changed, 1 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index 6dee9d8..5487ecd 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -1336,10 +1336,9 @@ fail:
>> qemuReportError(VIR_ERR_INTERNAL_ERROR,
>> _("cannot parse %s version number in '%s'"),
>> qemu, p ? p : help);
>> -
>> -cleanup:
>> VIR_FREE(p);
>>
>> +cleanup:
>
> Yuck. Why are we even calling strndup in the first place, just to
> produce a nicer error message? I'm pushing this instead.
>
> From ab6f1c9814f88e0547a5567176282f501fb138e2 Mon Sep 17 00:00:00 2001
> From: Eric Blake <eblake at redhat.com>
> Date: Fri, 27 Jan 2012 13:53:11 -0700
> Subject: [PATCH] qemu: avoid double free of qemu help output
>
> If yajl was not compiled in, we end up freeing an incoming
> parameter, which leads to a bogus free later on. Regression
> introduced in commit 6e769eb.
>
> * src/qemu/qemu_capabilities.c (qemuCapsParseHelpStr): Avoid alloc
> on failure path, which in turn fixes bogus free.
> Reported by Cole Robinson.
> ---
> src/qemu/qemu_capabilities.c | 10 ++++------
> 1 files changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 6dee9d8..426637c 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -1330,16 +1330,14 @@ int qemuCapsParseHelpStr(const char *qemu,
>
> fail:
> p = strchr(help, '\n');
> - if (p)
> - p = strndup(help, p - help);
> + if (!p)
> + p = strchr(help, '\0');
>
> qemuReportError(VIR_ERR_INTERNAL_ERROR,
> - _("cannot parse %s version number in '%s'"),
> - qemu, p ? p : help);
> + _("cannot parse %s version number in '%.*s'"),
> + qemu, (int) (p - help), help);
>
> cleanup:
> - VIR_FREE(p);
> -
> return -1;
> }
>
Cool, works for me.
Thanks,
Cole
More information about the libvir-list
mailing list