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 37b3c43..adeb335 100644
--- a/src/standard.c
+++ b/src/standard.c
@@ -1900,13 +1900,21 @@
* 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);