| Index: src/xz/util.c
|
| ===================================================================
|
| --- src/xz/util.c (revision 233270)
|
| +++ src/xz/util.c (working copy)
|
| @@ -26,10 +26,20 @@
|
| {
|
| 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);
|
| - 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;
|
| }
|
|
|
|
|