BUG/MEDIUM: tools: vsnprintf() is not always reliable on Solaris

Seen on Solaris 8, calling vsnprintf() with a null-size results
in the output size not being computed. This causes some random
behaviour including crashes when trying to display error messages
when loading an invalid configuration.
This commit is contained in:
Willy Tarreau 2013-04-01 22:48:54 +02:00
parent a39d19905e
commit 1b2fed6962

View File

@ -1900,13 +1900,21 @@ char *memprintf(char **out, const char *format, ...)
* intermediate evaluations get wrong.
*/
va_start(args, format);
needed = vsnprintf(ret, allocated, format, args) + 1;
needed = vsnprintf(ret, allocated, format, args);
va_end(args);
if (needed <= allocated)
break;
if (needed < allocated) {
/* Note: on Solaris 8, the first iteration always
* returns -1 if allocated is zero, so we force a
* retry.
*/
if (!allocated)
needed = 0;
else
break;
}
allocated = needed;
allocated = needed + 1;
ret = realloc(ret, allocated);
} while (ret);