about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedlibc.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-27 12:33:42 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-03-27 12:33:42 +0200
commit35e35ec5db52c96e71f8ed207265941e8734d8a1 (patch)
tree896633a09b219897d57abe30d160fc8b79429e91 /src/wrapped/wrappedlibc.c
parentde2b3afa17112423551c757d153df8c73d2e275e (diff)
downloadbox64-35e35ec5db52c96e71f8ed207265941e8734d8a1.tar.gz
box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.zip
Added clone wrapped function and libgbm wrapped lib
Diffstat (limited to 'src/wrapped/wrappedlibc.c')
-rwxr-xr-xsrc/wrapped/wrappedlibc.c43
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