]> Savannah Git Hosting - gnulib.git/commitdiff
xalloc: allow x2nrealloc (P, PN, S) where P && !*PN
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 12 Apr 2014 17:45:47 +0000 (10:45 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 12 Apr 2014 17:46:45 +0000 (10:46 -0700)
* lib/xalloc.h (x2nrealloc): Extend slightly, to allow the current
size to be zero even when the pointer is nonnull.  This
accommodates the use case where P is malloc (0) and *PN is 0 on a
host where malloc (0) yields nonnull.

ChangeLog
lib/xalloc.h

index 381b269b0b1e807eed51b60482f324f6da4867ea..6bf7c0085d07a914035a92bd00a738d25b7e44bc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-04-12  Paul Eggert  <eggert@cs.ucla.edu>
+
+       xalloc: allow x2nrealloc (P, PN, S) where P && !*PN
+       * lib/xalloc.h (x2nrealloc): Extend slightly, to allow the current
+       size to be zero even when the pointer is nonnull.  This
+       accommodates the use case where P is malloc (0) and *PN is 0 on a
+       host where malloc (0) yields nonnull.
+
 2014-04-09  Eric Blake  <eblake@redhat.com>
 
        fts: avoid unnecessary strlen calls
index 5f891457ba7476f5094cff1516d8093ff3a227d4..0bd6bce81c2c79b873e51dee48c841a1f12ecdb1 100644 (file)
@@ -122,10 +122,9 @@ xnrealloc (void *p, size_t n, size_t s)
 
 /* If P is null, allocate a block of at least *PN such objects;
    otherwise, reallocate P so that it contains more than *PN objects
-   each of S bytes.  *PN must be nonzero unless P is null, and S must
-   be nonzero.  Set *PN to the new number of objects, and return the
-   pointer to the new block.  *PN is never set to zero, and the
-   returned pointer is never null.
+   each of S bytes.  S must be nonzero.  Set *PN to the new number of
+   objects, and return the pointer to the new block.  *PN is never set
+   to zero, and the returned pointer is never null.
 
    Repeated reallocations are guaranteed to make progress, either by
    allocating an initial block with a nonzero size, or by allocating a
@@ -196,13 +195,13 @@ x2nrealloc (void *p, size_t *pn, size_t s)
     }
   else
     {
-      /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+      /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0.
          Check for overflow, so that N * S stays in size_t range.
-         The check is slightly conservative, but an exact check isn't
+         The check may be slightly conservative, but an exact check isn't
          worth the trouble.  */
       if ((size_t) -1 / 3 * 2 / s <= n)
         xalloc_die ();
-      n += (n + 1) / 2;
+      n += n / 2 + 1;
     }
 
   *pn = n;