[PATCH] winetest: Fix vstrfmtmake() for large strings.

Francois Gouget fgouget at codeweavers.com
Thu Aug 23 09:41:58 CDT 2018


Once a va_list has been iterated over one must reset it to the start. So
make a copy so we can call vsnprintf() more than once in case we have to
reallocate the buffer.
Also clearly separate the vstrfmtmake() part from the log writing one in
xprintf().

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 programs/winetest/util.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/programs/winetest/util.c b/programs/winetest/util.c
index af625e7d971..ea67a2d252c 100644
--- a/programs/winetest/util.c
+++ b/programs/winetest/util.c
@@ -66,7 +66,10 @@ static char *vstrfmtmake (size_t *lenp, const char *fmt, va_list ap)
     p = HeapAlloc(GetProcessHeap(), 0, size);
     if (!p) return NULL;
     while (1) {
-        n = vsnprintf (p, size, fmt, ap);
+        va_list local_ap;
+        va_copy(local_ap, ap);
+        n = vsnprintf (p, size, fmt, local_ap);
+        va_end(local_ap);
         if (n < 0) size *= 2;   /* Windows */
         else if ((unsigned)n >= size) size = n+1; /* glibc */
         else break;
@@ -110,8 +113,9 @@ void xprintf (const char *fmt, ...)
 
     va_start (ap, fmt);
     buffer = vstrfmtmake (&size, fmt, ap);
-    head = buffer;
     va_end (ap);
+
+    head = buffer;
     while (size) {
         if (!WriteFile( logfile, head, size, &written, NULL ))
             report (R_FATAL, "Can't write logs: %u", GetLastError());
-- 
2.18.0




More information about the wine-devel mailing list