diff --git a/porting/linux/user/src/hook/malloc_common.c b/porting/linux/user/src/hook/malloc_common.c index f4a77d2bcb5a41e94d5926e93f513a6932cdfb04..99b19b38b5c68efcbebc1bc848a5729305cbd240 100644 --- a/porting/linux/user/src/hook/malloc_common.c +++ b/porting/linux/user/src/hook/malloc_common.c @@ -50,4 +50,24 @@ int munmap(void* addr, size_t length) return MuslMalloc(munmap)(addr, 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); + } +} #endif diff --git a/porting/linux/user/src/hook/musl_preinit.c b/porting/linux/user/src/hook/musl_preinit.c index 5ea97c67c8cebc2d33dbfed5369bd3d62a4441ac..16fefbd0f6aa1d8beaad7998b77b3674b475fe46 100644 --- a/porting/linux/user/src/hook/musl_preinit.c +++ b/porting/linux/user/src/hook/musl_preinit.c @@ -42,6 +42,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 @@ -188,6 +190,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_hook_functions(void* shared_library_handler, struct MallocDispatchType* table, const char* prefix) { if (!init_malloc_function(shared_library_handler, &table->malloc, prefix)) { @@ -202,6 +226,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 3cf8ec7a77c268a5486a488e1c34a259e683f739..49d61091fd6aebfb9ee96ecd37c5c48880e1e9a9 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), }; volatile atomic_bool __hook_enable_hook_flag; 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);