summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2012-09-16 21:41:35 +0200
committerNiels Möller <nisse@lysator.liu.se>2012-09-16 21:41:35 +0200
commit728a20eed7ec34e917d3a992b7777ceb9cee8404 (patch)
tree66176e99492b4f184253e686a09aa2a9876f6921
parent3a73862a5229bc53142b19a1608d9b5125908eb4 (diff)
downloadnettle-728a20eed7ec34e917d3a992b7777ceb9cee8404.tar.gz
Avoid calling libc realloc with a requested size of zero.
-rw-r--r--ChangeLog4
-rw-r--r--realloc.c24
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;
}