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

Jim Meyering jim at meyering.net
Fri Feb 19 13:27:06 UTC 2010


Jim Meyering wrote:

> Daniel Veillard wrote:
>>> Subject: [PATCH] virBufferVSprintf: do not skip va_end
>>>
>>> * src/util/buf.c (virBufferVSprintf): Do not omit or skip va_end calls.
> ...
>>   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.
>
> Good catch.  Corrected, as you suggest:
>
>>From 313af81e8ff93ceb06b6086ea917db6a7eb160cc 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 omit va_end call
>
> * src/util/buf.c (virBufferVSprintf): Do not omit va_end call.
> Improved-by: Daniel Veillard.
> ---
>  .gnulib        |    2 +-
>  src/util/buf.c |    4 +++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/.gnulib b/.gnulib
> index 11fbc57..a1d565a 160000
> --- a/.gnulib
> +++ b/.gnulib
> @@ -1 +1 @@
> -Subproject commit 11fbc57405a118e6ec9a3ebc19bbf5ececdae4d6
> +Subproject commit a1d565aa5b47ec56243e74d4ac8b4988a751fef2
> diff --git a/src/util/buf.c b/src/util/buf.c
> index cc0a087..ef72294 100644
> --- a/src/util/buf.c
> +++ b/src/util/buf.c
> @@ -245,8 +245,10 @@ virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
>          va_end(locarg);
>
>          grow_size = (count > 1000) ? count : 1000;
> -        if (virBufferGrow(buf, grow_size) < 0)
> +        if (virBufferGrow(buf, grow_size) < 0) {
> +            va_end(argptr);
>              return;
> +        }
>
>          size = buf->size - buf->use - 1;
>          va_copy(locarg, argptr);

I looked at this again and realized that the above is insufficient.
We do have to call va_end(argptr) at the end, as well, so I'm merging
this additional change locally.  Otherwise, we'd leak in the common case.

diff --git a/.gnulib b/.gnulib
index 11fbc57..a1d565a 160000
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit 11fbc57405a118e6ec9a3ebc19bbf5ececdae4d6
+Subproject commit a1d565aa5b47ec56243e74d4ac8b4988a751fef2
diff --git a/src/util/buf.c b/src/util/buf.c
index ef72294..fc1217b 100644
--- a/src/util/buf.c
+++ b/src/util/buf.c
@@ -252,8 +252,9 @@ virBufferVSprintf(const virBufferPtr buf, const char *format, ...)

         size = buf->size - buf->use - 1;
         va_copy(locarg, argptr);
     }
+    va_end(argptr);
     va_end(locarg);
     buf->use += count;
     buf->content[buf->use] = '\0';
 }

Amended patch:

>From 2a5ca2656325546231a546cf580f08bb0462d37a 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 omit va_end(argptr) call

* src/util/buf.c (virBufferVSprintf): Do not omit va_end(argptr).
Improved-by: Daniel Veillard.
---
 .gnulib        |    2 +-
 src/util/buf.c |    5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/.gnulib b/.gnulib
index 11fbc57..a1d565a 160000
--- a/.gnulib
+++ b/.gnulib
@@ -1 +1 @@
-Subproject commit 11fbc57405a118e6ec9a3ebc19bbf5ececdae4d6
+Subproject commit a1d565aa5b47ec56243e74d4ac8b4988a751fef2
diff --git a/src/util/buf.c b/src/util/buf.c
index cc0a087..fc1217b 100644
--- a/src/util/buf.c
+++ b/src/util/buf.c
@@ -245,12 +245,15 @@ virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
         va_end(locarg);

         grow_size = (count > 1000) ? count : 1000;
-        if (virBufferGrow(buf, grow_size) < 0)
+        if (virBufferGrow(buf, grow_size) < 0) {
+            va_end(argptr);
             return;
+        }

         size = buf->size - buf->use - 1;
         va_copy(locarg, argptr);
     }
+    va_end(argptr);
     va_end(locarg);
     buf->use += count;
     buf->content[buf->use] = '\0';
--
1.7.0.233.g05e1a




More information about the libvir-list mailing list