diff --git a/porting/linux/user/src/hook/malloc_common.c b/porting/linux/user/src/hook/malloc_common.c index 30ab7ce6bfdc64fbdd52f2fad11d658b2c3678ba..3951ae9e59fcdee5b3bd18e063feedffe1911a52 100644 --- a/porting/linux/user/src/hook/malloc_common.c +++ b/porting/linux/user/src/hook/malloc_common.c @@ -51,6 +51,26 @@ int munmap(void* addr, size_t length) } } +void* calloc(size_t m, size_t n) +{ + volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table(); + if (__predict_false(dispatch_table != NULL)) { + return dispatch_table->calloc(m, n); + } else { + return MuslMalloc(calloc)(m, n); + } +} + +void* realloc(void *p, size_t n) +{ + volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table(); + if (__predict_false(dispatch_table != NULL)) { + return dispatch_table->realloc(p, n); + } else { + return MuslMalloc(realloc)(p, n); + } +} + size_t malloc_usable_size(void* addr) { volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table(); diff --git a/porting/linux/user/src/hook/musl_preinit.c b/porting/linux/user/src/hook/musl_preinit.c index 1b67d54a48baf77ef20e2ac8ff7da3c529f3fa12..5b598d2bc52b4d677cd28dea5ef26f88ef42c1da 100644 --- a/porting/linux/user/src/hook/musl_preinit.c +++ b/porting/linux/user/src/hook/musl_preinit.c @@ -43,6 +43,8 @@ static struct MallocDispatchType __ohos_malloc_hook_init_dispatch = { .free = MuslMalloc(free), .mmap = MuslMalloc(mmap), .munmap = MuslMalloc(munmap), + .calloc = MuslMalloc(calloc), + .realloc = MuslMalloc(realloc), }; #define MAX_SYM_NAME_SIZE 1000 #define MAX_PROC_NAME_SIZE 256 @@ -199,6 +201,28 @@ static bool init_memorytag_function(void* malloc_shared_library_handler, const c return true; } +static bool init_calloc_function(void* malloc_shared_library_handler, MallocCallocType* func, const char* prefix) +{ + char symbol[MAX_SYM_NAME_SIZE]; + snprintf(symbol, sizeof(symbol), "%s_%s", prefix, "calloc"); + *func = (MallocCallocType)(dlsym(malloc_shared_library_handler, symbol)); + if (*func == NULL) { + return false; + } + return true; +} + +static bool init_realloc_function(void* malloc_shared_library_handler, MallocReallocType* func, const char* prefix) +{ + char symbol[MAX_SYM_NAME_SIZE]; + snprintf(symbol, sizeof(symbol), "%s_%s", prefix, "realloc"); + *func = (MallocReallocType)(dlsym(malloc_shared_library_handler, symbol)); + if (*func == NULL) { + return false; + } + return true; +} + static bool init_malloc_usable_size_function(void* malloc_shared_library_handler, MallocMallocUsableSizeType* func, const char* prefix) { char symbol[MAX_SYM_NAME_SIZE]; @@ -224,6 +248,12 @@ static bool init_hook_functions(void* shared_library_handler, struct MallocDispa if (!init_munmap_function(shared_library_handler, &table->munmap, prefix)) { return false; } + if (!init_calloc_function(shared_library_handler, &table->calloc, prefix)) { + return false; + } + if (!init_realloc_function(shared_library_handler, &table->realloc, prefix)) { + return false; + } if (!init_memorytag_function(shared_library_handler, prefix)) { return false; } diff --git a/porting/linux/user/src/hook/musl_preinit_common.c b/porting/linux/user/src/hook/musl_preinit_common.c index 97468fc1ead7c70f8b7982ced6ad451bb96cbe0d..ef3cd14c45136a551983972e15952f0a24134538 100644 --- a/porting/linux/user/src/hook/musl_preinit_common.c +++ b/porting/linux/user/src/hook/musl_preinit_common.c @@ -12,6 +12,8 @@ struct MallocDispatchType __libc_malloc_default_dispatch = { .free = MuslMalloc(free), .mmap = MuslMalloc(mmap), .munmap = MuslMalloc(munmap), + .calloc = MuslMalloc(calloc), + .realloc = MuslMalloc(realloc), .malloc_usable_size = MuslMalloc(malloc_usable_size), }; diff --git a/porting/linux/user/src/malloc/malloc.c b/porting/linux/user/src/malloc/malloc.c index 4f267326373ad81ad282e37858e922632cd1165b..14dc7f1dbbcd81b22a568345dbf9ee5ef2e0a94b 100644 --- a/porting/linux/user/src/malloc/malloc.c +++ b/porting/linux/user/src/malloc/malloc.c @@ -564,7 +564,11 @@ static size_t mal0_clear(char *p, size_t pagesz, size_t n) } } +#ifdef HOOK_ENABLE +void *__libc_calloc(size_t m, size_t n) +#else void *calloc(size_t m, size_t n) +#endif { #ifdef USE_JEMALLOC return je_calloc(m, n); @@ -603,7 +607,11 @@ void *internal_calloc(size_t m, size_t n) return memset(p, 0, n); } +#ifdef HOOK_ENABLE +void *__libc_realloc(void *p, size_t n) +#else void *realloc(void *p, size_t n) +#endif { #ifdef USE_JEMALLOC return je_realloc(p, n);