Re: [PATCH] xrealloc: do not reuse pointer freed by zero-length realloc()
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Sep 1, 2020, 13:04 UTC
- Message-ID
- <c81b7225-a663-1598-62b3-bd80457d5648@gmail.com>
- In-Reply-To
- <20200901111800.GA3115584@coredump.intra.peff.net>
On 9/1/2020 7:18 AM, Jeff King wrote:
> This patch fixes a bug where xrealloc(ptr, 0) can double-free and > corrupt the heap on some platforms (including at least glibc).
!!! Good find !!!
Show 7 quoted lines
> The simplest fix here is to just pass "ret" (which we know to be NULL) > to the follow-up realloc(). That does mean that a system which _doesn't_ > free the original pointer would leak it. But that interpretation of the > standard seems unlikely (if a system didn't deallocate in this case, I'd > expect it to simply return the original pointer). If it turns out to be > an issue, we can handle the "!size" case up front instead, before we > call realloc() at all.
Adding an `if (!size) {free(ptr); return NULL;}` block was what I expected. Was that chosen just so we can rely more on the system realloc(), or is there a performance implication that I'm not seeing?
Show 6 quoted lines
> @@ -120,7 +120,7 @@ void *xrealloc(void *ptr, size_t size) > memory_limit_check(size, 0); > ret = realloc(ptr, size); > if (!ret && !size) > - ret = realloc(ptr, 1); > + ret = realloc(ret, 1);
I appreciate all the additional context for such a small change.
LGTM. -Stolee