From: Paul Eggert Date: Sat, 12 Apr 2014 17:45:47 +0000 (-0700) Subject: xalloc: allow x2nrealloc (P, PN, S) where P && !*PN X-Git-Tag: v1.0~7404 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=2f40bc523412742dac387b37d70b5a7f5d8363cc;p=gnulib.git 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 --git a/ChangeLog b/ChangeLog index 381b269b0b..6bf7c0085d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 --git a/lib/xalloc.h b/lib/xalloc.h index 5f891457ba..0bd6bce81c 100644 --- a/lib/xalloc.h +++ b/lib/xalloc.h @@ -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;