Make s(tr)pprintf infallible

spprintf now always creates a buffer and strpprintf always returns
a zend_string. Previously, if the result of the format happened to
be empty, the spprintf buffer would be set to NULL and strpprintf
would return NULL.
This commit is contained in:
Nikita Popov 2015-07-16 23:17:29 +02:00
parent daba578dbe
commit 75dc4486b2

View File

@ -838,7 +838,6 @@ skip_output:
PHPAPI size_t vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */
{
smart_string buf = {0};
size_t result;
/* since there are places where (v)spprintf called without checking for null,
a bit of defensive coding here */
@ -855,13 +854,11 @@ PHPAPI size_t vspprintf(char **pbuf, size_t max_len, const char *format, va_list
if (buf.c) {
*pbuf = buf.c;
result = buf.len;
return buf.len;
} else {
*pbuf = NULL;
result = 0;
*pbuf = estrndup("", 0);
return 0;
}
return result;
}
/* }}} */
@ -883,11 +880,15 @@ PHPAPI zend_string *vstrpprintf(size_t max_len, const char *format, va_list ap)
xbuf_format_converter(&buf, 0, format, ap);
if (max_len && buf.s && ZSTR_LEN(buf.s) > max_len) {
if (!buf.s) {
return ZSTR_EMPTY_ALLOC();
}
if (max_len && ZSTR_LEN(buf.s) > max_len) {
ZSTR_LEN(buf.s) = max_len;
}
smart_str_0(&buf);
smart_str_0(&buf);
return buf.s;
}
/* }}} */