diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-07-17 18:29:52 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-07-17 18:29:52 +0200 |
commit | b2df1577c7b62d9f6f9c06f41037e9bd09f2174d (patch) | |
tree | da614fca0b6b8219785b333e4e4c4ef3c69e799b /winsup/cygwin/exceptions.cc | |
parent | 16d2d9f1312653daa9cb8d4cdb3a113e53f432ca (diff) | |
download | cygnal-b2df1577c7b62d9f6f9c06f41037e9bd09f2174d.tar.gz cygnal-b2df1577c7b62d9f6f9c06f41037e9bd09f2174d.tar.bz2 cygnal-b2df1577c7b62d9f6f9c06f41037e9bd09f2174d.zip |
Fix ucontext creation in call_signal handler
* exceptions.cc (__unwind_single_frame): Define empty macro on i686.
(_cygtls::call_signal_handler): Try to make sure signal context makes
sense in case we're generating context here. Add comment to explain.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 6e9890e32..d69dbf799 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -300,6 +300,8 @@ __unwind_single_frame (PCONTEXT ctx) ctx->Rsp += 8; } } +#else +#define __unwind_single_frame(ctx) #endif /* Walk the stack. @@ -1667,11 +1669,20 @@ _cygtls::call_signal_handler () sizeof (CONTEXT)); else { - /* FIXME: Really this should be the context which the signal - interrupted? */ - memset(&context.uc_mcontext, 0, sizeof (struct __mcontext)); + /* Software-generated signal. We're fetching the current + context, unwind to the caller and in case we're called + from sigdelayed, fix rip/eip accordingly. */ context.uc_mcontext.ctxflags = CONTEXT_FULL; - RtlCaptureContext ((CONTEXT *) &context.uc_mcontext); + RtlCaptureContext ((PCONTEXT) &context.uc_mcontext); + __unwind_single_frame ((PCONTEXT) &context.uc_mcontext); + if (stackptr > stack) + { +#ifdef __x86_64__ + context.uc_mcontext.rip = retaddr (); +#else + context.uc_mcontext.eip = retaddr (); +#endif + } } if (this_sa_flags & SA_ONSTACK |