diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-09-12 13:56:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-09-12 13:56:51 +0200 |
| commit | c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9 (patch) | |
| tree | b9fc81f6cd77bfde401adae7945589cfa14476db /src | |
| parent | 411163c73f4acdd22b4a5058d50f7c6210dc6d0e (diff) | |
| download | box64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.tar.gz box64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.zip | |
Try to improve syscall rt_sigaction handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64syscall.c | 12 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 10 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index db71cd08..803f9dd2 100755 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -363,6 +363,9 @@ void EXPORT x64Syscall(x64emu_t *emu) *(int64_t*)&R_RAX = my_munmap(emu, (void*)R_RDI, R_RSI); break; case 13: // sys_rt_sigaction + #if 1 + R_RAX = (int64_t)my_syscall_rt_sigaction(emu, (int)R_EDI, (const x64_sigaction_restorer_t *)R_RSI, (x64_sigaction_restorer_t *)R_RDX, (size_t)R_R10); + #else { x64_sigaction_t n ={0}; x64_sigaction_t o = {0}; @@ -382,6 +385,7 @@ void EXPORT x64Syscall(x64emu_t *emu) memcpy(&p->sa_mask, &o.sa_mask, R_R10); } } + #endif break; #ifndef __NR_access case 21: // sys_access @@ -590,10 +594,13 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) case 9: // sys_mmap return (uintptr_t)my_mmap64(emu, (void*)R_RSI, R_RDX, (int)R_RCX, (int)R_R8d, (int)R_R9, i64(0)); case 10: // sys_mprotect - return (uint64_t)(int64_t)my_mprotect(emu, (void*)R_RSI, R_RDX, (int)R_ECX); + return (uint64_t)my_mprotect(emu, (void*)R_RSI, R_RDX, (int)R_ECX); case 11: // sys_munmap - return (uint64_t)(int64_t)my_munmap(emu, (void*)R_RSI, R_RDX); + return (uint64_t)my_munmap(emu, (void*)R_RSI, R_RDX); case 13: // sys_rt_sigaction + #if 1 + return my_syscall_rt_sigaction(emu, (int)R_ESI, (const x64_sigaction_restorer_t *)R_RDX, (x64_sigaction_restorer_t *)R_RCX, (size_t)R_R8); + #else { x64_sigaction_t n ={0}; x64_sigaction_t o = {0}; @@ -614,6 +621,7 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) } return ret; } + #endif #ifndef __NR_access case 21: // sys_access return (uint64_t)(int64_t)access((void*)R_RSI, R_EDX); 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; |