Index: libcxx/include/__support/ibm/xlocale.h =================================================================== --- libcxx/include/__support/ibm/xlocale.h +++ 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 "cstdlib" @@ -251,21 +252,22 @@ } static inline -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) - { - return -1; - } - if ((str_size = vsnprintf(*strp, buff_size, fmt, ap)) >= buff_size) - { - if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL) - { - return -1; +int vasprintf(char **strp, const char *fmt, va_list ap) { + int str_size = -1; + va_list ap2; + va_copy(ap2, ap); + int count = vsnprintf(0, 0, fmt, ap2); + va_end(ap2); + if (count < 0) return -1; + const size_t buf_size = count + 1; + char *const buf = (char *)malloc(buf_size); + if (buf) { + *strp = buf; + str_size = vsnprintf(*strp, buf_size, fmt, ap); + if (str_size < 0 || (size_t)str_size >= buf_size) { + free(buf); + str_size = -1; } - str_size = vsnprintf(*strp, str_size + 1, fmt, ap); } return str_size; }