diff --git a/crt/memory.c b/crt/memory.c index 056df20..6cd0b5b 100644 --- a/crt/memory.c +++ b/crt/memory.c @@ -20,15 +20,30 @@ __wrap_free(void *ptr) { } } +size_t +__wrap_malloc_usable_size(void *ptr) { + return MEMGetSizeForMBlockExpHeap(ptr); +} + void * __wrap_realloc(void *ptr, size_t size) { + if (!ptr) { + return __wrap_malloc(size); + } + + if (__wrap_malloc_usable_size(ptr) >= size) { + return ptr; + } + void *realloc_ptr = __wrap_malloc(size); - if(realloc_ptr) { - memcpy(realloc_ptr, ptr, size); - __wrap_free(ptr); + if(!realloc_ptr) { + return NULL; } + memcpy(realloc_ptr, ptr, __wrap_malloc_usable_size(ptr)); + __wrap_free(ptr); + return realloc_ptr; } @@ -43,11 +58,6 @@ __wrap_calloc(size_t num, size_t size) { return ptr; } -size_t -__wrap_malloc_usable_size(void *ptr) { - return MEMGetSizeForMBlockExpHeap(ptr); -} - void * __wrap_valloc(size_t size) { return __wrap_memalign(64, size);