diff options
-rw-r--r-- | accel-pppd/memdebug.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/accel-pppd/memdebug.c b/accel-pppd/memdebug.c index 286ddd8..67c8498 100644 --- a/accel-pppd/memdebug.c +++ b/accel-pppd/memdebug.c @@ -105,23 +105,37 @@ void __export md_free(void *ptr, const char *fname, int line) void __export *md_realloc(void *ptr, size_t size, const char *fname, int line) { - struct mem_t *mem = container_of(ptr, typeof(*mem), data); + struct mem_t *mem = ptr ? container_of(ptr, typeof(*mem), data) : NULL; struct mem_t *mem2; - - if (mem->magic1 != MAGIC1) { - printf("memory corruption:\nfree at %s:%i\n", fname, line); - abort(); - } - if (mem->magic2 != *(uint64_t*)(mem->data + mem->size)) { - printf("memory corruption:\nmalloc(%lu) at %s:%i\nfree at %s:%i\n", (long unsigned)mem->size, mem->fname, mem->line, fname, line); - abort(); + if (mem) { + if (mem->magic1 != MAGIC1) { + printf("memory corruption:\nfree at %s:%i\n", + fname, line); + abort(); + } + + if (mem->magic2 != *(uint64_t*)(mem->data + mem->size)) { + printf("memory corruption:\nmalloc(%zu) at %s:%i\nfree at %s:%i\n", + mem->size, mem->fname, mem->line, fname, line); + abort(); + } + + if (size == 0) { + md_free(mem->data, fname, line); + return NULL; + } } mem2 = _md_malloc(size, fname, line); - memcpy(mem2->data, mem->data, mem->size); - - md_free(mem->data, fname, line); + if (mem2 == NULL) + return NULL; + + if (mem) { + memcpy(mem2->data, mem->data, + (size < mem->size) ? size : mem->size); + md_free(mem->data, fname, line); + } return mem2->data; } |