Simplify signal handling code in libthr by removing use of SYS_sigreturn

The use of SYS_sigreturn is unnecessary here.

If handle_signal is called when a signal is delivered, it can just
return normally back to sigcode which will call sigreturn anyway.

In case handle_signal is called by check_deferred_signal, using
setcontext is better than SYS_sigreturn because that is the correct
system call to pair with the earlier getcontext.

Reviewed by:	imp, kib
Differential Revision:	https://reviews.freebsd.org/D44893
This commit is contained in:
Dapeng Gao 2024-06-03 12:18:13 -06:00 committed by Warner Losh
parent c0c066f86d
commit 7cae020b9c
1 changed files with 3 additions and 5 deletions

View File

@ -247,7 +247,6 @@ static void
handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp) handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp)
{ {
struct pthread *curthread = _get_curthread(); struct pthread *curthread = _get_curthread();
ucontext_t uc2;
__siginfohandler_t *sigfunc; __siginfohandler_t *sigfunc;
int cancel_point; int cancel_point;
int cancel_async; int cancel_async;
@ -307,13 +306,11 @@ handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp)
curthread->cancel_point = cancel_point; curthread->cancel_point = cancel_point;
curthread->cancel_enable = cancel_enable; curthread->cancel_enable = cancel_enable;
memcpy(&uc2, ucp, sizeof(uc2)); SIGDELSET(ucp->uc_sigmask, SIGCANCEL);
SIGDELSET(uc2.uc_sigmask, SIGCANCEL);
/* reschedule cancellation */ /* reschedule cancellation */
check_cancel(curthread, &uc2); check_cancel(curthread, ucp);
errno = err; errno = err;
syscall(SYS_sigreturn, &uc2);
} }
void void
@ -400,6 +397,7 @@ check_deferred_signal(struct pthread *curthread)
/* remove signal */ /* remove signal */
curthread->deferred_siginfo.si_signo = 0; curthread->deferred_siginfo.si_signo = 0;
handle_signal(&act, info.si_signo, &info, uc); handle_signal(&act, info.si_signo, &info, uc);
syscall(SYS_sigreturn, uc);
} }
static void static void