Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2008-11-28 05:56:09 +0300
committerChristopher Faylor <me@cgf.cx>2008-11-28 05:56:09 +0300
commit65ebf94e53514dc266c74bea7908ad3fe7fc4ebc (patch)
treeb535054572e9e15435dde80a8fde7401bef21f75
parent27171a8cfadacd4badb995e824ecdbc7648c1fd0 (diff)
* exceptions.cc (sigpacket::process): Make sure that 'tls' is never NULL when
used.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/exceptions.cc13
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);