X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fstr.c;h=fe9ad814680590df36575e9e18fc482c48631cf3;hb=27b7805829c01dec0507bc2afac9c6bfbf25c957;hp=2a766520b135f8d01b01b7ca0a638c589fe459de;hpb=317e6b778833b5dcd5dd195c0b677835a8024b2a;p=pspp diff --git a/src/str.c b/src/str.c index 2a766520b1..fe9ad81468 100644 --- a/src/str.c +++ b/src/str.c @@ -306,6 +306,7 @@ void ds_destroy (struct string *st) { free (st->string); + st->string = NULL; } /* Truncates ST to zero length. */ @@ -452,7 +453,9 @@ ds_vprintf (struct string *st, const char *format, va_list args) been written. */ int avail, needed; + va_list a1; + va_copy(a1, args); avail = st->capacity - st->length + 1; needed = vsnprintf (st->string + st->length, avail, format, args); @@ -461,17 +464,22 @@ ds_vprintf (struct string *st, const char *format, va_list args) { ds_extend (st, st->length + needed); - vsprintf (st->string + st->length, format, args); + vsprintf (st->string + st->length, format, a1); } else while (needed == -1) { + va_list a2; + va_copy(a2, a1); + ds_extend (st, (st->capacity + 1) * 2); avail = st->capacity - st->length + 1; - needed = vsnprintf (st->string + st->length, avail, format, args); + needed = vsnprintf (st->string + st->length, avail, format, a2); + va_end(a2); } + va_end(a1); st->length += needed; }