]> granicus.if.org Git - p11-kit/commitdiff
common: Fix vasprintf emulation
authorDaiki Ueno <dueno@redhat.com>
Sun, 2 Jun 2019 08:17:22 +0000 (10:17 +0200)
committerDaiki Ueno <ueno@gnu.org>
Tue, 18 Jun 2019 12:17:28 +0000 (14:17 +0200)
va_list must be saved when calling vsnprintf() in a loop.

common/compat.c

index 5f475342dab97c8d409d5cf216a29796fa42a1c4..621f03a5b011ed24bcea0f83bcdb92fbe909aaa0 100644 (file)
@@ -570,6 +570,7 @@ vasprintf (char **strp,
        char *nbuf;
        int guess = 128;
        int length = 0;
+       va_list orig, aq;
        int ret;
 
        if (fmt == NULL) {
@@ -577,17 +578,21 @@ vasprintf (char **strp,
                return -1;
        }
 
+       va_copy (orig, ap);
        for (;;) {
                nbuf = realloc (buf, guess);
                if (!nbuf) {
                        free (buf);
+                       va_end (orig);
                        return -1;
                }
 
                buf = nbuf;
                length = guess;
 
-               ret = vsnprintf (buf, length, fmt, ap);
+               va_copy (aq, orig);
+               ret = vsnprintf (buf, length, fmt, aq);
+               va_end (aq);
 
                if (ret < 0)
                        guess *= 2;
@@ -598,6 +603,7 @@ vasprintf (char **strp,
                else
                        break;
        }
+       va_end (orig);
 
        *strp = buf;
        return ret;