OSDN Git Service

* exceptions.cc (sigpacket::process): Make sure that 'tls' is never NULL when
authorcgf <cgf>
Fri, 28 Nov 2008 02:56:09 +0000 (02:56 +0000)
committercgf <cgf>
Fri, 28 Nov 2008 02:56:09 +0000 (02:56 +0000)
used.

winsup/cygwin/ChangeLog
winsup/cygwin/exceptions.cc

index e7b6f84..adbcbaa 100644 (file)
@@ -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.
 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>
index e744e7c..35aea15 100644 (file)
@@ -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);