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);
+	syscall(SYS_sigreturn, uc);
 }
 
 static void