diff options
author | kientzle <kientzle@FreeBSD.org> | 2004-08-26 03:33:53 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2004-08-26 03:33:53 +0000 |
commit | f9cf91fb01f884f0ce80e7691d05e23bb5028673 (patch) | |
tree | 9941579160bcac6186b65bad04cbaf7e688a37d1 /lib | |
parent | 8eb09c15b993bdc8a440fea689c6457f2cf9462c (diff) | |
download | FreeBSD-src-f9cf91fb01f884f0ce80e7691d05e23bb5028673.zip FreeBSD-src-f9cf91fb01f884f0ce80e7691d05e23bb5028673.tar.gz |
It is not legal to re-use a va_list variable. This caused
a crash on amd64, in particular.
Thanks to: Sean McNeil
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libarchive/archive_string_sprintf.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/libarchive/archive_string_sprintf.c b/lib/libarchive/archive_string_sprintf.c index 174d2f9..b191b4b 100644 --- a/lib/libarchive/archive_string_sprintf.c +++ b/lib/libarchive/archive_string_sprintf.c @@ -47,19 +47,22 @@ __archive_string_vsprintf(struct archive_string *as, const char *fmt, va_list ap) { size_t l; + va_list ap1; if (fmt == NULL) { as->s[0] = 0; return; } + va_copy(ap1, ap); l = vsnprintf(as->s, as->buffer_length, fmt, ap); /* If output is bigger than the buffer, resize and try again. */ if (l+1 >= as->buffer_length) { __archive_string_ensure(as, l + 1); - l = vsnprintf(as->s, as->buffer_length, fmt, ap); + l = vsnprintf(as->s, as->buffer_length, fmt, ap1); } as->length = l; + va_end(ap1); } /* |