changeset 8837:6d6277df29a9

Fix logic bug introduced on 2007-05-06.
author Bruno Haible <bruno@clisp.org>
date Sat, 19 May 2007 00:38:42 +0000
parents 07084ab003b8
children db95bdbeb72c
files ChangeLog lib/vasnprintf.c
diffstat 2 files changed, 26 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+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
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -2841,6 +2841,23 @@
 			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 @@
 			       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 @@
 		      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.  */