+2007-06-10 Bruno Haible <bruno@clisp.org>
+
+ * lib/vasnprintf.c (VASNPRINTF) [!USE_SNPRINTF]: Remove variable
+ 'maxlen'. Ensure only length + width bytes are allocated, not
+ length + 1 + width.
+
2007-06-09 Bruno Haible <bruno@clisp.org>
* lib/vasnprintf.c (FCHAR_T, DCHAR_T, TCHAR_T): New macros.
for (;;)
{
- size_t maxlen;
- int count;
- int retcount;
-
- maxlen = allocated - length;
- count = -1;
- retcount = 0;
+ int count = -1;
+ int retcount = 0;
#if USE_SNPRINTF
+ size_t maxlen = allocated - length;
/* SNPRINTF can fail if maxlen > INT_MAX. */
if (maxlen > INT_MAX)
goto overflow;
return NULL;
}
+#if USE_SNPRINTF
/* Make room for the result. */
if (count >= maxlen)
{
xmax (xsum (length, count), xtimes (allocated, 2));
ENSURE_ALLOCATION (n);
-#if USE_SNPRINTF
continue;
-#else
- maxlen = allocated - length;
+ }
#endif
+
+#if !USE_SNPRINTF
+ /* Make room for the result. */
+ if (count > allocated - length)
+ {
+ /* Need at least count bytes. But allocate
+ proportionally. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
}
+#endif
+
+ /* Here count <= allocated - length. */
/* Perform padding. */
#if NEED_PRINTF_FLAG_ZERO
{
# if USE_SNPRINTF
/* Make room for the result. */
- if (width >= maxlen)
+ if (width > maxlen)
{
/* Need at least width bytes. But allocate
proportionally, to avoid looping eternally if
snprintf() reports a too small count. */
size_t n =
- xmax (xsum (length + 1, width),
+ xmax (xsum (length, width),
xtimes (allocated, 2));
length += count;
ENSURE_ALLOCATION (n);
length -= count;
- maxlen = allocated - length; /* > width */
}
- /* Here width < maxlen. */
+ /* Here width <= allocated - length. */
# endif
{
# if USE_SNPRINTF
abort ();
#endif
- /* Here still count < maxlen. */
+ /* Here still count <= allocated - length. */
#if USE_SNPRINTF
/* The snprintf() result did fit. */