Cygwin: follow context if changed inside SA_SIGINFO signal handler

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2019-04-05 11:25:19 +02:00
parent c5f9eed1c0
commit 181ca73e49
1 changed files with 10 additions and 1 deletions

View File

@ -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