diff --git a/libcxx/include/__support/ibm/xlocale.h b/libcxx/include/__support/ibm/xlocale.h --- a/libcxx/include/__support/ibm/xlocale.h +++ b/libcxx/include/__support/ibm/xlocale.h @@ -10,6 +10,7 @@ #ifndef _LIBCPP_SUPPORT_IBM_XLOCALE_H #define _LIBCPP_SUPPORT_IBM_XLOCALE_H +#include #include <__support/ibm/locale_mgmt_aix.h> #include <__support/ibm/locale_mgmt_zos.h> @@ -268,18 +269,19 @@ } static inline -int vasprintf(char **strp, const char *fmt, va_list ap) -{ +int vasprintf(char **strp, const char *fmt, va_list ap) { const size_t buff_size = 256; - int str_size; - if ((*strp = (char *)malloc(buff_size)) == NULL) - { + if ((*strp = (char *)malloc(buff_size)) == NULL) { return -1; } - if ((str_size = vsnprintf(*strp, buff_size, fmt, ap)) >= buff_size) - { - if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL) - { + + va_list ap_copy; + va_copy(ap_copy, ap); + int str_size = vsnprintf(*strp, buff_size, fmt, ap_copy); + va_end(ap_copy); + + if ((size_t) str_size >= buff_size) { + if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL) { return -1; } str_size = vsnprintf(*strp, str_size + 1, fmt, ap); diff --git a/libcxx/src/support/win32/support.cpp b/libcxx/src/support/win32/support.cpp --- a/libcxx/src/support/win32/support.cpp +++ b/libcxx/src/support/win32/support.cpp @@ -22,7 +22,10 @@ { *sptr = NULL; // Query the count required. - int count = _vsnprintf( NULL, 0, format, ap ); + va_list ap_copy; + va_copy(ap_copy, ap); + int count = _vsnprintf( NULL, 0, format, ap_copy ); + va_end(ap_copy); if (count < 0) return count; size_t buffer_size = static_cast(count) + 1;