diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-15 10:17:12 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-15 10:17:12 +0100 |
| commit | 90e2f04c34e0fb4233683a41fc2b337d1e53bbea (patch) | |
| tree | db343f46a02d4b3911f82496aa79d34ad52fb700 /src | |
| parent | 9896b02bd6bbaa09d30de32723645409353bbdfd (diff) | |
| download | box64-90e2f04c34e0fb4233683a41fc2b337d1e53bbea.tar.gz box64-90e2f04c34e0fb4233683a41fc2b337d1e53bbea.zip | |
Workaround to handle SIGMAX properly (should help #1056)
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/box64context.h | 8 | ||||
| -rw-r--r-- | src/libtools/signals.c | 8 |
2 files changed, 8 insertions, 8 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h index 0a8f6532..96442038 100644 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -198,10 +198,10 @@ typedef struct box64context_s { uint8_t canary[8]; - uintptr_t signals[MAX_SIGNAL]; - uintptr_t restorer[MAX_SIGNAL]; - int onstack[MAX_SIGNAL]; - int is_sigaction[MAX_SIGNAL]; + uintptr_t signals[MAX_SIGNAL+1]; // signal should be 1..MAX_SIGNAL (no 0), but that's too much change... + uintptr_t restorer[MAX_SIGNAL+1]; + int onstack[MAX_SIGNAL+1]; + int is_sigaction[MAX_SIGNAL+1]; x64emu_t *emu_sig; // the emu with stack used for signal handling (must be separated from main ones) int no_sigsegv; int no_sigill; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 2482e7b1..19c49dab 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1684,7 +1684,7 @@ void emit_interruption(x64emu_t* emu, int num, void* addr) EXPORT sighandler_t my_signal(x64emu_t* emu, int signum, sighandler_t handler) { - if(signum<0 || signum>=MAX_SIGNAL) + if(signum<0 || signum>MAX_SIGNAL) return SIG_ERR; if(signum==SIGSEGV && emu->context->no_sigsegv) @@ -1715,7 +1715,7 @@ EXPORT sighandler_t my_sysv_signal(x64emu_t* emu, int signum, sighandler_t handl int EXPORT my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x64_sigaction_t *oldact) { printf_log(LOG_DEBUG, "Sigaction(signum=%d, act=%p(f=%p, flags=0x%x), old=%p)\n", signum, act, act?act->_u._sa_handler:NULL, act?act->sa_flags:0, oldact); - if(signum<0 || signum>=MAX_SIGNAL) { + if(signum<0 || signum>MAX_SIGNAL) { errno = EINVAL; return -1; } @@ -1772,7 +1772,7 @@ __attribute__((alias("my_sigaction"))); int EXPORT my_syscall_rt_sigaction(x64emu_t* emu, int signum, const x64_sigaction_restorer_t *act, x64_sigaction_restorer_t *oldact, int sigsetsize) { printf_log(LOG_DEBUG, "Syscall/Sigaction(signum=%d, act=%p, old=%p, size=%d)\n", signum, act, oldact, sigsetsize); - if(signum<0 || signum>=MAX_SIGNAL) { + if(signum<0 || signum>MAX_SIGNAL) { errno = EINVAL; return -1; } @@ -2035,7 +2035,7 @@ static void atfork_child_dynarec_prot(void) void init_signal_helper(box64context_t* context) { // setup signal handling - for(int i=0; i<MAX_SIGNAL; ++i) { + for(int i=0; i<=MAX_SIGNAL; ++i) { context->signals[i] = 0; // SIG_DFL } struct sigaction action = {0}; |