From e45b1aa9118b8dec9fc665fb461ce4145dbcc4d0 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 17 Jun 2024 19:19:51 -0300 Subject: [PATCH] signal: use usercopy --- kernel-src/sys/signal.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/kernel-src/sys/signal.c b/kernel-src/sys/signal.c index a97f7d54..e50a77f6 100644 --- a/kernel-src/sys/signal.c +++ b/kernel-src/sys/signal.c @@ -1,6 +1,7 @@ #include #include #include +#include #define ACTION_TERM 0 #define ACTION_IGN 1 @@ -373,17 +374,25 @@ bool signal_check(struct thread_t *thread, context_t *context, bool syscall, uin } // configure stack frame - sigframe_t *sigframe = stack; - sigframe->restorer = action->restorer; + sigframe_t sigframe; + sigframe.restorer = action->restorer; if (altstack) { - memcpy(&sigframe->oldstack, &thread->signals.stack, sizeof(stack_t)); + memcpy(&sigframe.oldstack, &thread->signals.stack, sizeof(stack_t)); memset(&thread->signals.stack, 0, sizeof(stack_t)); } - memcpy(&sigframe->oldmask, &thread->signals.mask, sizeof(sigset_t)); - memcpy(&sigframe->context, context, sizeof(context_t)); - memcpy(&sigframe->extracontext, &thread->extracontext, sizeof(extracontext_t)); + memcpy(&sigframe.oldmask, &thread->signals.mask, sizeof(sigset_t)); + memcpy(&sigframe.context, context, sizeof(context_t)); + memcpy(&sigframe.extracontext, &thread->extracontext, sizeof(extracontext_t)); // TODO siginfo + if (usercopy_touser(stack, &sigframe, sizeof(sigframe_t))) { + printf("signal: bad user stack\n"); + THREAD_LEAVE(thread); + PROCESS_LEAVE(proc); + interrupt_set(true); + sched_terminateprogram(SIGSEGV); + } + // configure new thread signal mask if ((action->flags & SA_NODEFER) == 0) SIGNAL_SETON(&thread->signals.mask, signal);