From 5a5f6e50c725e80e433466bd9b516a34dc6ab491 Mon Sep 17 00:00:00 2001 From: sit-d <281093367+sit-d@users.noreply.github.com> Date: Sun, 5 Jul 2026 03:59:51 -0600 Subject: [PATCH] fix: copy va_list before formatter retries --- errnfo.c | 8 +++++--- modsnap.c | 9 +++++++-- wchain.c | 9 +++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/errnfo.c b/errnfo.c index 038364d..684636b 100644 --- a/errnfo.c +++ b/errnfo.c @@ -144,11 +144,14 @@ static void errw(const wchar_t* s) { static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t stackbuf[2048]; + va_list ap2; + va_copy(ap2, ap); #if defined(_MSC_VER) - int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, ap); + int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, ap2); #else - int n = vswprintf(stackbuf, (int)(sizeof(stackbuf) / sizeof(stackbuf[0])), fmt, ap); + int n = vswprintf(stackbuf, (int)(sizeof(stackbuf) / sizeof(stackbuf[0])), fmt, ap2); #endif + va_end(ap2); if (n >= 0) { write_w(h, is_console, stackbuf); return; @@ -158,7 +161,6 @@ static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t* dyn = (wchar_t*)malloc(cap * sizeof(wchar_t)); if (!dyn) return; - va_list ap2; va_copy(ap2, ap); #if defined(_MSC_VER) _vsnwprintf_s(dyn, cap, _TRUNCATE, fmt, ap2); diff --git a/modsnap.c b/modsnap.c index 2021466..f45f322 100644 --- a/modsnap.c +++ b/modsnap.c @@ -92,7 +92,10 @@ static void errw(const wchar_t* s) { static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t stackbuf[2048]; - int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, ap); + va_list copy; + va_copy(copy, ap); + int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, copy); + va_end(copy); if (n >= 0) { write_w(h, is_console, stackbuf); return; @@ -103,7 +106,9 @@ static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t* dyn = (wchar_t*)malloc(cap * sizeof(wchar_t)); if (!dyn) return; - _vsnwprintf_s(dyn, cap, _TRUNCATE, fmt, ap); + va_copy(copy, ap); + _vsnwprintf_s(dyn, cap, _TRUNCATE, fmt, copy); + va_end(copy); write_w(h, is_console, dyn); free(dyn); } diff --git a/wchain.c b/wchain.c index 4383946..7e4add5 100644 --- a/wchain.c +++ b/wchain.c @@ -143,7 +143,10 @@ static void errw(const wchar_t* s) { static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t stackbuf[2048]; - int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, ap); + va_list copy; + va_copy(copy, ap); + int n = _vsnwprintf_s(stackbuf, _countof(stackbuf), _TRUNCATE, fmt, copy); + va_end(copy); if (n >= 0) { write_w(h, is_console, stackbuf); return; @@ -154,7 +157,9 @@ static void vfmt_to(HANDLE h, bool is_console, const wchar_t* fmt, va_list ap) { wchar_t* dyn = (wchar_t*)HeapAlloc(GetProcessHeap(), 0, cap * sizeof(wchar_t)); if (!dyn) return; - _vsnwprintf_s(dyn, cap, _TRUNCATE, fmt, ap); + va_copy(copy, ap); + _vsnwprintf_s(dyn, cap, _TRUNCATE, fmt, copy); + va_end(copy); write_w(h, is_console, dyn); HeapFree(GetProcessHeap(), 0, dyn); }