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@xxxxxxxxxx> > 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@xxxxxxxxxx> 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list