From a9d874c32dfd9cf400716d80196de4f282e80414 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 16 Apr 2026 17:59:57 -0300 Subject: [PATCH] sigreturn: add bad behavior checks and mask flags --- kernel-src/sys/syscalls/sigreturn.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel-src/sys/syscalls/sigreturn.c b/kernel-src/sys/syscalls/sigreturn.c index 16971f48..932351e9 100644 --- a/kernel-src/sys/syscalls/sigreturn.c +++ b/kernel-src/sys/syscalls/sigreturn.c @@ -11,11 +11,16 @@ __attribute__((noreturn)) void syscall_sigreturn(context_t *context) { sigframe_t *sigframe = __builtin_alloca(ARCH_SIGFRAME_SIZE); int error = usercopy_fromuser(sigframe, (void *)CTX_SP(context), ARCH_SIGFRAME_SIZE); - if (error || ARCH_CONTEXT_ISUSER(&sigframe->context) == false) { + if (error || ARCH_CONTEXT_ISUSER(&sigframe->context) == false || !IS_USER_ADDRESS(CTX_IP(&sigframe->context))) { printf("syscall_sigreturn: bad return stack or bad return information\n"); proc_terminate(SIGSEGV); } +#ifdef __x86_64__ + // CF PF AF ZF SF TF DF OF RF AC + sigframe->context.rflags &= 0x50DD5; +#endif + interrupt_set(false); signal_altstack(current_thread(), &sigframe->oldstack, NULL); signal_changemask(current_thread(), SIG_SETMASK, &sigframe->oldmask, NULL);