summaryrefslogtreecommitdiff
path: root/realloc.c
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 /realloc.c
parent3a73862a5229bc53142b19a1608d9b5125908eb4 (diff)
downloadnettle-728a20eed7ec34e917d3a992b7777ceb9cee8404.tar.gz
Avoid calling libc realloc with a requested size of zero.
Diffstat (limited to 'realloc.c')
-rw-r--r--realloc.c24
1 files changed, 18 insertions, 6 deletions
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;
}