This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin] Cygwin: follow context if changed inside SA_SIGINFO signal handler
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 5 Apr 2019 09:25:31 -0000
- Subject: [newlib-cygwin] Cygwin: follow context if changed inside SA_SIGINFO signal handler
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=181ca73e493ee134aec1431f398423ed619627b2
commit 181ca73e493ee134aec1431f398423ed619627b2
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Fri Apr 5 11:25:19 2019 +0200
Cygwin: follow context if changed inside SA_SIGINFO signal handler
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
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 0aaeee5..e5e7703 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