From c54ec039eb0ea6e6e74025fca2ee2de6ab5b79e5 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sun, 18 Nov 2018 07:59:05 +0200 Subject: copy symbols in wrapper_create We don't know the lifetime of the const char* input, so lets copy it. this is quite naive, solution for now, but should be good enough as this is mainly for debugging. Maybe leter do something more fancy to avoid copies from symbols that came from linker for example, and use hashtable to avoid duplication. --- src/wrapper/wrapper.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/wrapper/wrapper.c b/src/wrapper/wrapper.c index b3249b6..9b2ed96 100644 --- a/src/wrapper/wrapper.c +++ b/src/wrapper/wrapper.c @@ -103,13 +103,18 @@ wrapper_create(const char *const symbol, void *function) return NULL; } + const size_t len = strlen(symbol) + 1; + char *copy = malloc(len); + assert(copy && "welp, malloc failed"); + memcpy(copy, symbol, len); + #ifdef WRAPPER_TRACE const size_t sz = &wrapper_end - &wrapper_start; unsigned char *fun = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); assert(fun != MAP_FAILED); memcpy(fun, &wrapper_start, sz); #ifdef ANDROID_X86_LINKER - memcpy(fun + (&wrapper_symbol - &wrapper_start) + 1, &symbol, sizeof(symbol)); + memcpy(fun + (&wrapper_symbol - &wrapper_start) + 1, ©, sizeof(symbol)); memcpy(fun + (&wrapper_trace - &wrapper_start) + 1, (uintptr_t[]){ (uintptr_t)trace }, sizeof(uintptr_t)); memcpy(fun + (&wrapper_call - &wrapper_start) + 1, &function, sizeof(function)); #else -- cgit v1.2.3