diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2012-09-28 20:11:09 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2012-12-15 20:01:45 +0200 |
commit | fb68497333598688d309a92838d91fd560f7e9f0 (patch) | |
tree | 84c045acf6b00cde2154a0ad13abd04c9038d8af /src/xz | |
parent | A few typo fixes to comments and the xz man page. (diff) | |
download | xz-fb68497333598688d309a92838d91fd560f7e9f0.tar.xz |
xz: Improve handling of failed realloc in xrealloc.
Thanks to Jim Meyering.
Diffstat (limited to 'src/xz')
-rw-r--r-- | src/xz/util.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/xz/util.c b/src/xz/util.c index 987b4430..35850f4c 100644 --- a/src/xz/util.c +++ b/src/xz/util.c @@ -26,9 +26,19 @@ xrealloc(void *ptr, size_t size) { 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; } |