From: Willy Tarreau Date: Mon, 1 Apr 2013 20:48:54 +0000 (+0200) Subject: BUG/MEDIUM: tools: vsnprintf() is not always reliable on Solaris X-Git-Tag: v1.5-dev18~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1b2fed696292b2352a4e14006eabf308876079ec;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/standard.c b/src/standard.c index 37b3c436e3..adeb335fff 100644 --- a/src/standard.c +++ b/src/standard.c @@ -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);