summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/exceptions.cc15
2 files changed, 14 insertions, 6 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 0ac85de9f..60b05ddc9 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2013-06-07 Christopher Faylor <me.cygwin2013@cgf.cx>
+ * exceptions.cc (exception::handle): Add comment explaining si_addr
+ behavior.
+
+2013-06-07 Christopher Faylor <me.cygwin2013@cgf.cx>
+
* DevNotes: Add entry cgf-000023.
* sigproc.cc (exit_thread): Remove now-unneeded sleep code.
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index aa0036a18..c1b313910 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -753,6 +753,10 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
}
cygwin_exception exc (framep, in, e);
si.si_cyg = (void *) &exc;
+ /* POSIX requires that for SIGSEGV and SIGBUS, si_addr should be set to the
+ address of faulting memory reference. For SIGILL and SIGFPE these should
+ be the address of the faulting instruction. Other signals are apparently
+ undefined so we just set those to the faulting instruction too. */
si.si_addr = (si.si_signo == SIGSEGV || si.si_signo == SIGBUS)
? (void *) e->ExceptionInformation[1] : (void *) in->_GR(ip);
me.incyg++;
@@ -767,12 +771,11 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
#define SIG_NONMASKABLE (SIGTOMASK (SIGKILL) | SIGTOMASK (SIGSTOP))
/* Non-raceable sigsuspend
- * Note: This implementation is based on the Single UNIX Specification
- * man page. This indicates that sigsuspend always returns -1 and that
- * attempts to block unblockable signals will be silently ignored.
- * This is counter to what appears to be documented in some UNIX
- * man pages, e.g. Linux.
- */
+ Note: This implementation is based on the Single UNIX Specification
+ man page. This indicates that sigsuspend always returns -1 and that
+ attempts to block unblockable signals will be silently ignored.
+ This is counter to what appears to be documented in some UNIX
+ man pages, e.g. Linux. */
int __stdcall
handle_sigsuspend (sigset_t tempmask)
{