From 002602ef276ff9d5227af67fc3d3e7bbc13261c8 Mon Sep 17 00:00:00 2001 From: lutao Date: Thu, 10 Nov 2022 17:02:10 +0800 Subject: [PATCH] fixed 6ff6b31 from https://gitee.com/lu-tao/third_party_musl/pulls/670 add calloc and realloc hook Signed-off-by: lutao --- porting/linux/user/src/hook/malloc_common.c | 20 +++++++++++++ porting/linux/user/src/hook/musl_preinit.c | 30 +++++++++++++++++++ .../linux/user/src/hook/musl_preinit_common.c | 2 ++ porting/linux/user/src/malloc/malloc.c | 8 +++++ 4 files changed, 60 insertions(+) diff --git a/porting/linux/user/src/hook/malloc_common.c b/porting/linux/user/src/hook/malloc_common.c index f4a77d2b..99b19b38 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 5ea97c67..16fefbd0 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 3cf8ec7a..49d61091 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 4f267326..14dc7f1d 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); -- GitLab