From: Russ Allbery <rra@debian.org>
Date: Sun, 17 Feb 2008 22:23:24 -0800
Subject: Correct use of va_list

va_copy a va_list before using it in vsprintf so that we don't use the
same va_list repeatedly.  Patch taken from the upstream bug tracker
and will apparently be in the next release after 5.0beta8.
---
 src/tfio.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/tfio.c b/src/tfio.c
index 2cd2103..151583e 100644
--- a/src/tfio.c
+++ b/src/tfio.c
@@ -497,6 +497,7 @@ void vSprintf(String *buf, int flags, const char *fmt, va_list ap)
     const conString *Sval;
     int len, min, max, leftjust, stars;
     attr_t attrs = buf->attrs;
+    va_list ap_copy;
 
     if (!(flags & SP_APPEND) && buf->data) Stringtrunc(buf, 0);
     while (*fmt) {
@@ -522,7 +523,9 @@ void vSprintf(String *buf, int flags, const char *fmt, va_list ap)
         case 'x': case 'X': case 'u': case 'o':
         case 'f': case 'e': case 'E': case 'g': case 'G':
         case 'p':
-            vsprintf(tempbuf, spec, ap);
+            va_copy(ap_copy, ap);
+            vsprintf(tempbuf, spec, ap_copy);
+            va_end(ap_copy);
             Stringcat(buf, tempbuf);
             /* eat the arguments used by vsprintf() */
             while (stars--) (void)va_arg(ap, int);
