From 1b2fed696292b2352a4e14006eabf308876079ec Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 1 Apr 2013 22:48:54 +0200 Subject: [PATCH] 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. --- src/standard.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) 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); -- 2.47.3