+2007-05-18 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [NEED_PRINTF_FLAG_ZERO]: Fix logic bug
+ introduced on 2007-05-06.
+
2007-05-18 Bruno Haible <bruno@clisp.org>
* tests/test-vasnprintf-posix.c (test_function): Also test the %e and
return NULL;
}
+ /* Make room for the result. */
+ if (count >= maxlen)
+ {
+ /* Need at least count bytes. But allocate
+ proportionally, to avoid looping eternally if
+ snprintf() reports a too small count. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+#if USE_SNPRINTF
+ continue;
+#else
+ maxlen = allocated - length;
+#endif
+ }
+
/* Perform padding. */
#if NEED_PRINTF_FLAG_ZERO
if (pad_ourselves && has_width && count < width)
proportionally, to avoid looping eternally if
snprintf() reports a too small count. */
size_t n =
- xmax (xsum (length, width),
+ xmax (xsum (length + 1, width),
xtimes (allocated, 2));
length += count;
ENSURE_ALLOCATION (n);
length -= count;
- maxlen = allocated - length; /* >= width */
+ maxlen = allocated - length; /* > width */
}
+ /* Here width < maxlen. */
# endif
{
# if USE_SNPRINTF
abort ();
#endif
- /* Make room for the result. */
- if (count >= maxlen)
- {
- /* Need at least count bytes. But allocate
- proportionally, to avoid looping eternally if
- snprintf() reports a too small count. */
- size_t n =
- xmax (xsum (length, count), xtimes (allocated, 2));
-
- ENSURE_ALLOCATION (n);
-#if USE_SNPRINTF
- continue;
-#endif
- }
+ /* Here still count < maxlen. */
#if USE_SNPRINTF
/* The snprintf() result did fit. */