From dd6ceef65e424d30db8706273f88c20b015012ce Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 19 May 2007 00:38:42 +0000 Subject: [PATCH] Fix logic bug introduced on 2007-05-06. --- ChangeLog | 5 +++++ lib/vasnprintf.c | 37 +++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8e4c10f1bc..a69b511010 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-05-18 Bruno Haible + + * lib/vasnprintf.c (VASNPRINTF) [NEED_PRINTF_FLAG_ZERO]: Fix logic bug + introduced on 2007-05-06. + 2007-05-18 Bruno Haible * tests/test-vasnprintf-posix.c (test_function): Also test the %e and diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c index f67211b95f..0a89f25d31 100644 --- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -2841,6 +2841,23 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar 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) @@ -2853,14 +2870,15 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar 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 @@ -2919,20 +2937,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar 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. */ -- 2.30.2