From 728a20eed7ec34e917d3a992b7777ceb9cee8404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Sun, 16 Sep 2012 21:41:35 +0200 Subject: [PATCH] Avoid calling libc realloc with a requested size of zero. --- ChangeLog | 4 ++++ realloc.c | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index cdac8ae7..72dcf479 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-09-16 Niels Möller <nisse@lysator.liu.se> + * realloc.c (nettle_realloc): Only call libc realloc if length > + 0, otherwise call free. Fixes a small memory leak. + (nettle_xrealloc): Likewise. + * run-tests (test_program): Don't quote $EMULATOR; allow it to expand to program and arguments (e.g., valgrind). diff --git a/realloc.c b/realloc.c index f5684028..5c12a0b9 100644 --- a/realloc.c +++ b/realloc.c @@ -31,20 +31,32 @@ #include "realloc.h" +/* NOTE: Calling libc realloc with size == 0 is not required to + totally free the object, it is allowed to return a valid + pointer. */ void * nettle_realloc(void *ctx UNUSED, void *p, unsigned length) { - return realloc(p, length); + if (length > 0) + return realloc(p, length); + + free(p); + return NULL; } void * nettle_xrealloc(void *ctx UNUSED, void *p, unsigned length) { - void *n = realloc(p, length); - if (length && !n) + if (length > 0) { - fprintf(stderr, "Virtual memory exhausted.\n"); - abort(); + void *n = realloc(p, length); + if (!n) + { + fprintf(stderr, "Virtual memory exhausted.\n"); + abort(); + } + return n; } - return n; + free(p); + return NULL; } -- GitLab