about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-30 11:12:51 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-10-30 11:12:51 +0100
commit541adff4d40db9d32076c222c8e1289c5fceb84c (patch)
tree9fc89c33599f3ef43cfe9ebbf4e7408ff81a9801 /src
parent39189a746bbe9f93617eda2b35c7b97ed105542a (diff)
downloadbox64-541adff4d40db9d32076c222c8e1289c5fceb84c.tar.gz
box64-541adff4d40db9d32076c222c8e1289c5fceb84c.zip
Improved clone wrapped function compatibility
Diffstat (limited to 'src')
-rw-r--r--src/include/box64context.h1
-rw-r--r--src/libtools/threads.c5
-rw-r--r--src/wrapped/wrappedlibc.c1
3 files changed, 6 insertions, 1 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h
index 8899460e..d27a23af 100644
--- a/src/include/box64context.h
+++ b/src/include/box64context.h
@@ -267,6 +267,7 @@ int AddTLSPartition(box64context_t* context, int tlssize);
 
 // defined in fact in threads.c
 void thread_set_emu(x64emu_t* emu);
+void thread_forget_emu();
 x64emu_t* thread_get_emu(void);
 
 // unlock mutex that are locked by current thread (for signal handling). Return a mask of unlock mutex
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index e19b3fda..afa7a337 100644
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -161,7 +161,10 @@ static void emuthread_cancel(void* p)
 	et->cancels=NULL;
 	et->cancel_size = et->cancel_cap = 0;
 }
-
+void thread_forget_emu()
+{
+	pthread_setspecific(thread_key, NULL);
+}
 void thread_set_emu(x64emu_t* emu)
 {
 	emuthread_t *et = (emuthread_t*)pthread_getspecific(thread_key);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index db57e446..8c9be048 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -3632,6 +3632,7 @@ static int clone_fn(void* p)
     x64emu_t *emu = arg->emu;
     R_RSP = arg->stack;
     emu->flags.quitonexit = 1;
+    thread_forget_emu();    //TODO: not all will flags needs this, probably just CLONE_VM?
     thread_set_emu(emu);
     if(arg->flags&CLONE_NEWUSER) {
         init_mutexes(my_context);