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