diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-27 12:33:42 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-27 12:33:42 +0200 |
| commit | 35e35ec5db52c96e71f8ed207265941e8734d8a1 (patch) | |
| tree | 896633a09b219897d57abe30d160fc8b79429e91 /src/wrapped/wrappedlibc.c | |
| parent | de2b3afa17112423551c757d153df8c73d2e275e (diff) | |
| download | box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.tar.gz box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.zip | |
Added clone wrapped function and libgbm wrapped lib
Diffstat (limited to 'src/wrapped/wrappedlibc.c')
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 2b311ece..4d2f2b1c 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2674,6 +2674,49 @@ EXPORT int my_stime(x64emu_t* emu, const time_t *t) return -1; } +typedef struct clone_arg_s { + x64emu_t* emu; + uintptr_t fnc; + void* args; + int stack_clone_used; +} clone_arg_t; +static int clone_fn(void* p) +{ + clone_arg_t* arg = (clone_arg_t*)p; + x64emu_t *emu = arg->emu; + thread_set_emu(emu); + int ret = RunFunction(my_context, arg->fnc, 1, arg->args); + FreeX64Emu(&emu); + if(arg->stack_clone_used) + my_context->stack_clone_used = 0; + free(arg); + return ret; +} + +EXPORT int my_clone(x64emu_t* emu, void* fn, void* stack, int flags, void* args, void* parent, void* tls, void* child) +{ + x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack, 0, 0); + SetupX64Emu(newemu); + CloneEmu(newemu, emu); + void* mystack = NULL; + clone_arg_t* arg = (clone_arg_t*)calloc(1, sizeof(clone_arg_t)); + if(my_context->stack_clone_used) { + mystack = malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it + } else { + if(!my_context->stack_clone) + my_context->stack_clone = malloc(1024*1024); + mystack = my_context->stack_clone; + my_context->stack_clone_used = 1; + arg->stack_clone_used = 1; + } + arg->emu = newemu; + arg->args = args; + arg->fnc = (uintptr_t)fn; + // x86_64 raw clone is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); + int64_t ret = clone(clone_fn, (void*)((uintptr_t)mystack+1024*1024), flags, arg, parent, tls, child); + return (uintptr_t)ret; +} + EXPORT char** my_environ = NULL; EXPORT char** my__environ = NULL; EXPORT char** my___environ = NULL; // all aliases |