xz: Improve handling of failed realloc in xrealloc.
Thanks to Jim Meyering.
This commit is contained in:
parent
75013db6d4
commit
fb68497333
|
@ -26,9 +26,19 @@ xrealloc(void *ptr, size_t size)
|
||||||
{
|
{
|
||||||
assert(size > 0);
|
assert(size > 0);
|
||||||
|
|
||||||
|
// Save ptr so that we can free it if realloc fails.
|
||||||
|
// The point is that message_fatal ends up calling stdio functions
|
||||||
|
// which in some libc implementations might allocate memory from
|
||||||
|
// the heap. Freeing ptr improves the chances that there's free
|
||||||
|
// memory for stdio functions if they need it.
|
||||||
|
void *p = ptr;
|
||||||
ptr = realloc(ptr, size);
|
ptr = realloc(ptr, size);
|
||||||
if (ptr == NULL)
|
|
||||||
message_fatal("%s", strerror(errno));
|
if (ptr == NULL) {
|
||||||
|
const int saved_errno = errno;
|
||||||
|
free(p);
|
||||||
|
message_fatal("%s", strerror(saved_errno));
|
||||||
|
}
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue