diff --git a/include/kore/kore.h b/include/kore/kore.h index ee124f6..c09d8eb 100644 --- a/include/kore/kore.h +++ b/include/kore/kore.h @@ -908,6 +908,7 @@ void *kore_calloc(size_t, size_t); void *kore_realloc(void *, size_t); void kore_free(void *); void kore_mem_init(void); +void kore_free_zero(void *); void kore_mem_cleanup(void); void kore_mem_untag(void *); void *kore_mem_lookup(u_int32_t); diff --git a/src/mem.c b/src/mem.c index beed187..1f5f76d 100644 --- a/src/mem.c +++ b/src/mem.c @@ -123,11 +123,11 @@ kore_realloc(void *ptr, size_t len) nptr = mem_alloc(len); } else { mem = meminfo(ptr); - if (len == mem->len) + if (len <= mem->len) return (ptr); nptr = mem_alloc(len); - memcpy(nptr, ptr, MIN(len, mem->len)); - kore_free(ptr); + memcpy(nptr, ptr, mem->len); + kore_free_zero(ptr); } return (nptr); @@ -149,6 +149,20 @@ kore_calloc(size_t memb, size_t len) return (ptr); } +void +kore_free_zero(void *ptr) +{ + struct meminfo *mem; + + if (ptr == NULL) + return; + + mem = meminfo(ptr); + kore_mem_zero(ptr, mem->len); + + kore_free(ptr); +} + void kore_free(void *ptr) {