# HG changeset patch # User Paul Eggert # Date 1397324747 25200 # Node ID eaa841a1f670d1cb62b5bfd35d31a2f3eeb0f980 # Parent 8af917141d49148f94e8e4ef8d6052aeadfdc204 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. diff -r 8af917141d49 -r eaa841a1f670 ChangeLog --- a/ChangeLog Wed Apr 09 10:20:08 2014 -0600 +++ b/ChangeLog Sat Apr 12 10:45:47 2014 -0700 @@ -1,3 +1,11 @@ +2014-04-12 Paul Eggert + + 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 fts: avoid unnecessary strlen calls diff -r 8af917141d49 -r eaa841a1f670 lib/xalloc.h --- a/lib/xalloc.h Wed Apr 09 10:20:08 2014 -0600 +++ b/lib/xalloc.h Sat Apr 12 10:45:47 2014 -0700 @@ -122,10 +122,9 @@ /* 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 @@ } 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;