about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-10-16 11:00:07 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-10-16 11:00:07 +0200
commitb40cb7b84a1a404a0d2b042791d9133bde3f1b77 (patch)
tree841823ebc7ac61b2cd3ba5ee6e8a3bb177d4dca0
parentd0045b158b30434c2077693d970e2167a1089e84 (diff)
downloadbox64-b40cb7b84a1a404a0d2b042791d9133bde3f1b77.tar.gz
box64-b40cb7b84a1a404a0d2b042791d9133bde3f1b77.zip
[DYNAREC] Fixed potential issue with signel not being re-enabled after FillBlock64 got canceled in a signal handler
-rw-r--r--src/dynarec/dynablock.c13
-rw-r--r--src/dynarec/dynarec_native.c4
-rw-r--r--src/include/dynablock.h1
3 files changed, 14 insertions, 4 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index 28906f96..d603fdd9 100644
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -221,6 +221,16 @@ void cancelFillBlock()
     LongJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1);
 }
 
+#ifndef WIN32
+static int critical_filled = 0;
+static sigset_t critical_prot = {0};
+sigset_t old_sig = {0};
+#endif
+
+void cancelFillBlockCriticalSection()
+{
+    pthread_sigmask(SIG_SETMASK, &old_sig, NULL);
+}
 /* 
     return NULL if block is not found / cannot be created. 
     Don't create if create==0
@@ -238,9 +248,6 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
     }
 
     #ifndef WIN32
-    static int critical_filled = 0;
-    static sigset_t critical_prot = {0};
-    sigset_t old_sig = {0};
     if(!critical_filled) {
         critical_filled = 1;
         sigfillset(&critical_prot);
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index e73870c5..961ba441 100644
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -493,8 +493,10 @@ void CancelBlock64(int need_lock)
     }
     current_helper = NULL;
     redundant_helper = NULL;
-    if(need_lock)
+    if(need_lock) {
         mutex_unlock(&my_context->mutex_dyndump);
+        cancelFillBlockCriticalSection();
+    }
 }
 
 uintptr_t native_pass0(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max);
diff --git a/src/include/dynablock.h b/src/include/dynablock.h
index 650e18cd..42bf34b5 100644
--- a/src/include/dynablock.h
+++ b/src/include/dynablock.h
@@ -20,6 +20,7 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr,
 
 // for use in signal handler
 void cancelFillBlock(void);
+void cancelFillBlockCriticalSection(void);
 
 // clear instruction cache on a range
 void ClearCache(void* start, size_t len);