diff --git a/Zend/zend_reflection_api.c b/Zend/zend_reflection_api.c index 4df1f9d438e..21c8bf95f7a 100644 --- a/Zend/zend_reflection_api.c +++ b/Zend/zend_reflection_api.c @@ -80,17 +80,18 @@ string *string_printf(string *str, const char *format, ...) { int n; va_list arg; - va_start(arg, format); - n = vsnprintf(str->string + str->len - 1, str->alloced - str->len, format, arg); - if (n > str->alloced - str->len) { - while (n + str->len > str->alloced ) { - str->alloced *= 2; - } - str->string = erealloc(str->string, str->alloced + 1); - n = vsnprintf(str->string + str->len - 1, str->alloced - str->len, format, arg); + char *s_tmp; + + va_start(arg, format); + n = zend_vspprintf(&s_tmp, 0, format, arg); + if (n) { + str->alloced += n; + str->string = erealloc(str->string, str->alloced); + memcpy(str->string + str->len - 1, s_tmp, n); + str->len += n; } + efree(s_tmp); va_end(arg); - str->len += n; return str; } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 4df1f9d438e..21c8bf95f7a 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -80,17 +80,18 @@ string *string_printf(string *str, const char *format, ...) { int n; va_list arg; - va_start(arg, format); - n = vsnprintf(str->string + str->len - 1, str->alloced - str->len, format, arg); - if (n > str->alloced - str->len) { - while (n + str->len > str->alloced ) { - str->alloced *= 2; - } - str->string = erealloc(str->string, str->alloced + 1); - n = vsnprintf(str->string + str->len - 1, str->alloced - str->len, format, arg); + char *s_tmp; + + va_start(arg, format); + n = zend_vspprintf(&s_tmp, 0, format, arg); + if (n) { + str->alloced += n; + str->string = erealloc(str->string, str->alloced); + memcpy(str->string + str->len - 1, s_tmp, n); + str->len += n; } + efree(s_tmp); va_end(arg); - str->len += n; return str; }