summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-04-05 11:25:19 +0200
committerCorinna Vinschen <corinna@vinschen.de>2019-04-05 11:25:19 +0200
commit181ca73e493ee134aec1431f398423ed619627b2 (patch)
tree6825ae386c78917db13a9bc40e7ebe9cb22b826c
parentc5f9eed1c045ad05e968c9a9b8fb22b1d46cd8ea (diff)
downloadcygnal-181ca73e493ee134aec1431f398423ed619627b2.tar.gz
cygnal-181ca73e493ee134aec1431f398423ed619627b2.tar.bz2
cygnal-181ca73e493ee134aec1431f398423ed619627b2.zip
Cygwin: follow context if changed inside SA_SIGINFO signal handler
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/exceptions.cc11
1 files changed, 10 insertions, 1 deletions
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