[libvirt] [PATCH] dnsmasq: Fix parsing of the version number
Michal Privoznik
mprivozn at redhat.com
Thu Dec 6 12:39:29 UTC 2012
On 06.12.2012 13:29, Laine Stump wrote:
> On 12/06/2012 06:34 AM, Michal Privoznik wrote:
>> If the debugging is enabled, the virCommand subsystem catches debug
>> messages in the command output as well. In that case, we can't assume
>> the string corresponding to command's stdout will start with specific
>> prefix. But the prefix can be moved deeper in the string. This bug
>> shows itself when parsing dnsmasq output:
>>
>> 2012-12-06 11:18:11.445+0000: 18491: error :
>> dnsmasqCapsSetFromBuffer:664 : internal error cannot parse
>> /usr/sbin/dnsmasq version number in '2012-12-06 11:11:02.232+0000:
>> 18492: debug : virFileClose:72 : Closed fd 22'
>>
>> We can clearly see that the output of dnsmasq --version
>> doesn't start with expected "Dnsmasq version " string but a libvirt
>> debug output.
>
> This is a bug in virCommand, and should also affect
> qemuCapsParseHelpStr(). Is there no way to fix it at the source, rather
> than working around it like this?
Oh, right. The reason why this doesn't get exposed with
qemuCapsParseHelpStr() is - we are not keeping stderr when executing
'qemu --help' but we are doing that for dnsmasq. So I guess this patch
is obsolete and should be instead replaced by:
diff --git a/src/util/dnsmasq.c b/src/util/dnsmasq.c
index 4f210d2..bee3b61 100644
--- a/src/util/dnsmasq.c
+++ b/src/util/dnsmasq.c
@@ -715,7 +715,6 @@ dnsmasqCapsRefreshInternal(dnsmasqCapsPtr caps, bool
force)
cmd = virCommandNewArgList(caps->binaryPath, "--version", NULL);
virCommandSetOutputBuffer(cmd, &version);
- virCommandSetErrorBuffer(cmd, &version);
virCommandAddEnvPassCommon(cmd);
virCommandClearCaps(cmd);
if (virCommandRun(cmd, NULL) < 0) {
@@ -727,7 +726,6 @@ dnsmasqCapsRefreshInternal(dnsmasqCapsPtr caps, bool
force)
cmd = virCommandNewArgList(caps->binaryPath, "--help", NULL);
virCommandSetOutputBuffer(cmd, &help);
- virCommandSetErrorBuffer(cmd, &help);
virCommandAddEnvPassCommon(cmd);
virCommandClearCaps(cmd);
if (virCommandRun(cmd, NULL) < 0) {
>
>
>> ---
>> src/util/dnsmasq.c | 4 ++--
>> 1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/util/dnsmasq.c b/src/util/dnsmasq.c
>> index 4f210d2..de0293a 100644
>> --- a/src/util/dnsmasq.c
>> +++ b/src/util/dnsmasq.c
>> @@ -641,9 +641,9 @@ dnsmasqCapsSetFromBuffer(dnsmasqCapsPtr caps, const char *buf)
>>
>> caps->noRefresh = true;
>>
>> - p = STRSKIP(buf, DNSMASQ_VERSION_STR);
>> - if (!p)
>> + if (!(p = strstr(buf, DNSMASQ_VERSION_STR)))
>> goto fail;
>> + p += sizeof(DNSMASQ_VERSION_STR) - 1;
>
> Why -1 ? That happens to work, but wouldn't if the version string didn't
> end with a space.
sizeof(const char[]) counts '\0' at the end. We don't want that here.
>
>> virSkipSpaces(&p);
>> if (virParseVersionString(p, &caps->version, true) < 0)
>> goto fail;
>
> I'd rather make sure that nobody has a bright idea on how to fix
> virCommand before pushing this.
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
More information about the libvir-list
mailing list