diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-10-16 11:00:07 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-10-16 11:00:07 +0200 |
| commit | b40cb7b84a1a404a0d2b042791d9133bde3f1b77 (patch) | |
| tree | 841823ebc7ac61b2cd3ba5ee6e8a3bb177d4dca0 | |
| parent | d0045b158b30434c2077693d970e2167a1089e84 (diff) | |
| download | box64-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.c | 13 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 4 | ||||
| -rw-r--r-- | src/include/dynablock.h | 1 |
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); |