From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: Re: [PATCH for-4.6] tools/xenstore: Correct use of va_end() after va_copy() Date: Thu, 13 Aug 2015 10:45:14 +0100 Message-ID: <20150813094514.GB22638@zion.uk.xensource.com> References: <1438955519-7071-1-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1438955519-7071-1-git-send-email-andrew.cooper3@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Andrew Cooper Cc: Wei Liu , Ian Jackson , Ian Campbell , Xen-devel List-Id: xen-devel@lists.xenproject.org On Fri, Aug 07, 2015 at 02:51:59PM +0100, Andrew Cooper wrote: > C requires that every use of va_copy() is matched with a va_end() call. > > This is especially important for x86_64 as va_{start,copy}() may need to > allocate memory to generate a va_list containing parameters which were > previously in registers. > > Signed-off-by: Andrew Cooper Release-acked-by: Wei Liu > --- > CC: Ian Campbell > CC: Ian Jackson > CC: Wei Liu > --- > tools/xenstore/talloc.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/tools/xenstore/talloc.c b/tools/xenstore/talloc.c > index 54dbd02..d7edcf3 100644 > --- a/tools/xenstore/talloc.c > +++ b/tools/xenstore/talloc.c > @@ -1101,13 +1101,16 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) > > /* this call looks strange, but it makes it work on older solaris boxes */ > if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) { > + va_end(ap2); > return NULL; > } > + va_end(ap2); > > ret = _talloc(t, len+1); > if (ret) { > VA_COPY(ap2, ap); > vsnprintf(ret, len+1, fmt, ap2); > + va_end(ap2); > talloc_set_name_const(ret, ret); > } > > @@ -1161,8 +1164,10 @@ static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) > * the original string. Most current callers of this > * function expect it to never return NULL. > */ > + va_end(ap2); > return s; > } > + va_end(ap2); > > s = talloc_realloc(NULL, s, char, s_len + len+1); > if (!s) return NULL; > @@ -1170,6 +1175,7 @@ static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) > VA_COPY(ap2, ap); > > vsnprintf(s+s_len, len+1, fmt, ap2); > + va_end(ap2); > talloc_set_name_const(s, s); > > return s; > -- > 1.7.10.4