diff options
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 2e25aa2..49fc166 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -659,7 +659,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, /* If we're exiting, tell Windows to keep looking for an exception handler. */ - if (exit_state || e->ExceptionFlags) + if (exit_state || (e->ExceptionFlags & ~EXCEPTION_SOFTWARE_ORIGINATE)) return ExceptionContinueSearch; siginfo_t si = {}; @@ -1791,6 +1791,13 @@ _cygtls::call_signal_handler () to 16 byte. */ uintptr_t new_sp = ((uintptr_t) _my_tls.altstack.ss_sp + _my_tls.altstack.ss_size) & ~0xf; + /* Copy context1 to the alternate signal stack area, because the + context1 allocated in the normal stack area is not accessible + from the signal handler that uses alternate signal stack. */ + thiscontext = (ucontext_t *) ((new_sp - sizeof (ucontext_t)) & ~0xf); + memcpy (thiscontext, &context1, sizeof (ucontext_t)); + new_sp = (uintptr_t) thiscontext; + /* In assembler: Save regs on new stack, move to alternate stack, call thisfunc, revert stack regs. */ #ifdef __x86_64__ @@ -1834,6 +1841,7 @@ _cygtls::call_signal_handler () #else #error unimplemented for this target #endif + memcpy (&context1, thiscontext, sizeof (ucontext_t)); } else /* No alternate signal stack requested or available, just call |