diff options
author | Christopher Faylor <me@cgf.cx> | 2008-11-28 02:56:09 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2008-11-28 02:56:09 +0000 |
commit | 65ebf94e53514dc266c74bea7908ad3fe7fc4ebc (patch) | |
tree | b535054572e9e15435dde80a8fde7401bef21f75 | |
parent | 27171a8cfadacd4badb995e824ecdbc7648c1fd0 (diff) | |
download | cygnal-65ebf94e53514dc266c74bea7908ad3fe7fc4ebc.tar.gz cygnal-65ebf94e53514dc266c74bea7908ad3fe7fc4ebc.tar.bz2 cygnal-65ebf94e53514dc266c74bea7908ad3fe7fc4ebc.zip |
* exceptions.cc (sigpacket::process): Make sure that 'tls' is never NULL when
used.
-rw-r--r-- | winsup/cygwin/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/exceptions.cc | 13 |
2 files changed, 12 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e7b6f84c6..adbcbaa45 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2008-11-27 Christopher Faylor <me+cygwin@cgf.cx> + + * exceptions.cc (sigpacket::process): Make sure that 'tls' is never + NULL when used. + 2008-11-26 Christopher Faylor <me+cygwin@cgf.cx> Remove unneeded whitespace throughout. @@ -207,7 +212,7 @@ 2008-10-06 Christopher Faylor <me+cygwin@cgf.cx> * cygtls.h (_cygtls::initialized): Remove bogus stack check which would - when checking the current thread from the current thread. + crash when checking the current thread from the current thread. * tlsoffsets.h: Regenerate. 2008-10-05 Christopher Faylor <me+cygwin@cgf.cx> diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index e744e7c5d..35aea1591 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1191,20 +1191,22 @@ sigpacket::process () else handler = NULL; + bool tls_was_null = !tls; + if (tls_was_null) + tls = _main_tls; + if (si.si_signo == SIGKILL) goto exit_sig; if (si.si_signo == SIGSTOP) { sig_clear (SIGCONT); - if (!tls) - tls = _main_tls; goto stop; } bool insigwait_mask; if ((masked = ISSTATE (myself, PID_STOPPED))) insigwait_mask = false; - else if (!tls) + else if (tls_was_null) insigwait_mask = !handler && (tls = _cygtls::find_tls (si.si_signo)); else insigwait_mask = sigismember (&tls->sigwait_mask, si.si_signo); @@ -1216,12 +1218,9 @@ sigpacket::process () /* nothing to do */; else if (sigismember (mask, si.si_signo)) masked = true; - else if (tls) + else masked = sigismember (&tls->sigmask, si.si_signo); - if (!tls) - tls = _main_tls; - if (masked) { sigproc_printf ("signal %d blocked", si.si_signo); |