[libvirt] [PATCH] virBufferVSprintf: do not skip va_end

Daniel Veillard veillard at redhat.com
Fri Feb 19 10:30:31 UTC 2010


On Thu, Feb 18, 2010 at 09:27:25PM +0100, Jim Meyering wrote:
> This fixes the last of the varargs problems reported by coverity:
> 
> va_end(argptr) was never called, and va_end(locarg) would have
> been skipped upon OOM.
> 
> >From 7a75b9da0d08a54e9f256dd26cca061b59c32c6d Mon Sep 17 00:00:00 2001
> From: Jim Meyering <meyering at redhat.com>
> Date: Thu, 18 Feb 2010 21:25:01 +0100
> Subject: [PATCH] virBufferVSprintf: do not skip va_end
> 
> * src/util/buf.c (virBufferVSprintf): Do not omit or skip va_end calls.
> ---
>  src/util/buf.c |    7 +++++--
>  1 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/src/util/buf.c b/src/util/buf.c
> index cc0a087..caf8ee0 100644
> --- a/src/util/buf.c
> +++ b/src/util/buf.c
> @@ -246,14 +246,17 @@ virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
> 
>          grow_size = (count > 1000) ? count : 1000;
>          if (virBufferGrow(buf, grow_size) < 0)
> -            return;
> +            goto cleanup;
> 
>          size = buf->size - buf->use - 1;
>          va_copy(locarg, argptr);
>      }
> -    va_end(locarg);
>      buf->use += count;
>      buf->content[buf->use] = '\0';
> +
> + cleanup:
> +    va_end(argptr);
> +    va_end(locarg);
>  }
> 
>  /**

  Hum, that one I'm not sure. In the case of virBufferGrow failure,
we just did va_end(locarg); in the loop before, so going to cleanup
there does it twice, and I'm not sure it's legal. Probably simpler to
add just va_end(argptr); before return in that case and drop the
cleanup: target.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list