From 181ca73e493ee134aec1431f398423ed619627b2 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 5 Apr 2019 11:25:19 +0200 Subject: [PATCH] Cygwin: follow context if changed inside SA_SIGINFO signal handler Signed-off-by: Corinna Vinschen --- winsup/cygwin/exceptions.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 0aaeee52f..e5e770370 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1645,7 +1645,7 @@ _cygtls::call_signal_handler () siginfo_t thissi = infodata; void (*thisfunc) (int, siginfo_t *, void *) = func; - ucontext_t *thiscontext = NULL; + ucontext_t *thiscontext = NULL, context_copy; /* Only make a context for SA_SIGINFO handlers */ if (this_sa_flags & SA_SIGINFO) @@ -1701,6 +1701,7 @@ _cygtls::call_signal_handler () ? (uintptr_t) thissi.si_addr : 0; thiscontext = &context; + context_copy = context; } int this_errno = saved_errno; @@ -1822,6 +1823,14 @@ _cygtls::call_signal_handler () ? context.uc_sigmask : this_oldmask); if (this_errno >= 0) set_errno (this_errno); + if (this_sa_flags & SA_SIGINFO) + { + /* If more than just the sigmask in the context has been changed by + the signal handler, call setcontext. */ + context_copy.uc_sigmask = context.uc_sigmask; + if (memcmp (&context, &context_copy, sizeof context) != 0) + setcontext (&context); + } } /* FIXME: Since 2011 this return statement always returned 1 (meaning