about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-15 10:17:12 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-15 10:17:12 +0100
commit90e2f04c34e0fb4233683a41fc2b337d1e53bbea (patch)
treedb343f46a02d4b3911f82496aa79d34ad52fb700 /src
parent9896b02bd6bbaa09d30de32723645409353bbdfd (diff)
downloadbox64-90e2f04c34e0fb4233683a41fc2b337d1e53bbea.tar.gz
box64-90e2f04c34e0fb4233683a41fc2b337d1e53bbea.zip
Workaround to handle SIGMAX properly (should help #1056)
Diffstat (limited to 'src')
-rw-r--r--src/include/box64context.h8
-rw-r--r--src/libtools/signals.c8
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};