summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/archive_string_sprintf.c
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2004-08-26 03:33:53 +0000
committerkientzle <kientzle@FreeBSD.org>2004-08-26 03:33:53 +0000
commitf9cf91fb01f884f0ce80e7691d05e23bb5028673 (patch)
tree9941579160bcac6186b65bad04cbaf7e688a37d1 /lib/libarchive/archive_string_sprintf.c
parent8eb09c15b993bdc8a440fea689c6457f2cf9462c (diff)
downloadFreeBSD-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/libarchive/archive_string_sprintf.c')
-rw-r--r--lib/libarchive/archive_string_sprintf.c5
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);
}
/*
OpenPOWER on IntegriCloud