On Tue, Sep 01, 2020 at 09:04:36AM -0400, Derrick Stolee wrote: > > 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? I went back and forth on whether to do that or not. This case should basically never happen, so I like both the performance and readability of only triggering it when realloc() returns NULL. But it would get rid of the hand-waving above, and I doubt the performance is measurable. If we do handle it up-front, then I think we'd actually want: if (!size) { free(ptr); return xmalloc(0); } (i.e., to never return NULL for consistency with xmalloc() and xcalloc()). > > @@ -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. Somebody's got to complete with you for ratio of commit message to diff lines. :) -Peff