Fix inefficiency introduced on 2007-11-03.
authorBruno Haible <bruno@clisp.org>
Fri, 9 Nov 2007 11:52:05 +0000 (12:52 +0100)
committerBruno Haible <bruno@clisp.org>
Fri, 9 Nov 2007 11:52:05 +0000 (12:52 +0100)
ChangeLog
lib/vasnprintf.c

index ff7b1d0..727651c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2007-11-09  Bruno Haible  <bruno@clisp.org>
 
+       * lib/vasnprintf.c (VASNPRINTF): Increase reallocation of snprintf
+       buffer. Fixes an inefficiency introduced on 2007-11-03.
+
+2007-11-09  Bruno Haible  <bruno@clisp.org>
+
        * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8) [BeOS]: Make this test return
        none instead of tr_TR. Fixes a failure of test-c-strcasecmp.c.
 
index b7b58df..ccc531b 100644 (file)
@@ -4294,13 +4294,19 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
                          goto overflow;
                        else
                          {
-                           /* Need at least count * sizeof (TCHAR_T) bytes.
-                              But allocate proportionally, to avoid looping
+                           /* Need at least (count + 1) * sizeof (TCHAR_T)
+                              bytes.  (The +1 is for the trailing NUL.)
+                              But ask for (count + 2) * sizeof (TCHAR_T)
+                              bytes, so that in the next round, we likely get
+                                maxlen > (unsigned int) count + 1
+                              and so we don't get here again.
+                              And allocate proportionally, to avoid looping
                               eternally if snprintf() reports a too small
                               count.  */
                            size_t n =
                              xmax (xsum (length,
-                                         (count + TCHARS_PER_DCHAR - 1)
+                                         ((unsigned int) count + 2
+                                          + TCHARS_PER_DCHAR - 1)
                                          / TCHARS_PER_DCHAR),
                                    xtimes (allocated, 2));