# HG changeset patch # User Bruno Haible # Date 1181476975 0 # Node ID f2b97e5b14f5d21ba6d0f86a8825aff71fafe57d # Parent aea67e2678d9eeb05e23ac4c537cd2ef6f7271a6 Tweak the size computations and reallocations. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-06-10 Bruno Haible + + * 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 * lib/vasnprintf.c (FCHAR_T, DCHAR_T, TCHAR_T): New macros. diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c --- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -2812,15 +2812,11 @@ 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; @@ -3035,6 +3031,7 @@ return NULL; } +#if USE_SNPRINTF /* Make room for the result. */ if (count >= maxlen) { @@ -3045,12 +3042,24 @@ 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 @@ -3058,21 +3067,20 @@ { # 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 @@ -3131,7 +3139,7 @@ abort (); #endif - /* Here still count < maxlen. */ + /* Here still count <= allocated - length. */ #if USE_SNPRINTF /* The snprintf() result did fit. */