about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-12 13:56:51 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-12 13:56:51 +0200
commitc8c09d7e099320e55fb82a0d3019ff62d0cf8bc9 (patch)
treeb9fc81f6cd77bfde401adae7945589cfa14476db /src/libtools
parent411163c73f4acdd22b4a5058d50f7c6210dc6d0e (diff)
downloadbox64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.tar.gz
box64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.zip
Try to improve syscall rt_sigaction handling
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/signals.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index df0b7d0b..72bd00fc 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -1075,7 +1075,7 @@ void emit_signal(x64emu_t* emu, int sig, void* addr, int code)
     ucontext_t ctx = {0};
     siginfo_t info = {0};
     info.si_signo = sig;
-    info.si_errno = (sig==SIGSEGV)?0x1234:0;    // MAark as a sign this is a #GP(0) (like privileged instruction)
+    info.si_errno = (sig==SIGSEGV)?0x1234:0;    // Mark as a sign this is a #GP(0) (like privileged instruction)
     info.si_code = code;
     info.si_addr = addr;
     const char* x64name = NULL;
@@ -1122,8 +1122,10 @@ 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)
 {
-    if(signum<0 || signum>=MAX_SIGNAL)
+    if(signum<0 || signum>=MAX_SIGNAL) {
+        errno = EINVAL;
         return -1;
+    }
     
     if(signum==SIGSEGV && emu->context->no_sigsegv)
         return 0;
@@ -1174,8 +1176,10 @@ __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;
+    }
     
     if(signum==SIGSEGV && emu->context->no_sigsegv)
         return 0;