Fixed bug #14822.
[pspp] / src / str.c
index 2a766520b135f8d01b01b7ca0a638c589fe459de..fe9ad814680590df36575e9e18fc482c48631cf3 100644 (file)
--- 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;
 }