From 286fa94064dcc6d1b260bec77de052274e3c4403 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 8 Nov 2016 18:44:06 -0500 Subject: [PATCH] Use va_copy() in pure-windows version of tor_asprintf(). It's not okay to use the same varargs list twice, and apparently some windows build environments produce code here that would leave tor_asprintf() broken. Fix for bug 20560; bugfix on 0.2.2.11-alpha when tor_asprintf() was introduced. --- changes/bug20560 | 4 ++++ src/common/compat.c | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 changes/bug20560 diff --git a/changes/bug20560 b/changes/bug20560 new file mode 100644 index 0000000000..43d605b296 --- /dev/null +++ b/changes/bug20560 @@ -0,0 +1,4 @@ + o Minor bugfixes (portability): + - Run correctly when built on Windows build environments that require + _vcsprintf(). Fixes bug 20560; bugfix on 0.2.2.11-alpha. + diff --git a/src/common/compat.c b/src/common/compat.c index 4f2f9778f2..8d6a491c42 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -532,7 +532,10 @@ tor_vasprintf(char **strp, const char *fmt, va_list args) /* On Windows, _vsnprintf won't tell us the length of the string if it * overflows, so we need to use _vcsprintf to tell how much to allocate */ int len, r; - len = _vscprintf(fmt, args); + va_list tmp_args; + va_copy(tmp_args, args); + len = _vscprintf(fmt, tmp_args); + va_end(tmp_args); if (len < 0) { *strp = NULL; return -1;