]> sourceware.org Git - newlib-cygwin.git/commitdiff
Handle ss_flags value longjmp safe.
authorCorinna Vinschen <corinna@vinschen.de>
Sat, 27 Jun 2015 10:08:07 +0000 (12:08 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Sat, 27 Jun 2015 10:08:07 +0000 (12:08 +0200)
* exceptions.cc (_cygtls::call_signal_handler): Drop manipulating
thread's ss_flags here.  It's not safe against longjmp.
* signal.cc (sigaltstack): Check if we're running on the alternate
stack and set ss_flags returned in oss to SS_ONSTACK.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
winsup/cygwin/ChangeLog
winsup/cygwin/exceptions.cc
winsup/cygwin/signal.cc

index 7f33687ec8c12143fe35a62d2fdc1641c76cb4ef..31b429ba14847373bb267417c9409b37509fee47 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-27  Corinna Vinschen  <corinna@vinschen.de>
+
+       * exceptions.cc (_cygtls::call_signal_handler): Drop manipulating
+       thread's ss_flags here.  It's not safe against longjmp.
+       * signal.cc (sigaltstack): Check if we're running on the alternate
+       stack and set ss_flags returned in oss to SS_ONSTACK.
+
 2015-06-26  Corinna Vinschen  <corinna@vinschen.de>
 
        * include/cygwin/signal.h: Revert to define MINSIGSTKSZ and SIGSTKSZ
index d493abb00b04129b12ccf7e63f7da54c63343512..90a8ff25d3ae58f1e96a709f0b34f2249bfb897e 100644 (file)
@@ -1599,8 +1599,6 @@ _cygtls::call_signal_handler ()
          uintptr_t new_sp = (uintptr_t) _my_tls.altstack.ss_sp
                             + _my_tls.altstack.ss_size;
          new_sp &= ~0xf;
-         /* Mark alternate stack as used. */
-         _my_tls.altstack.ss_flags = SS_ONSTACK;
          /* In assembler: Save regs on new stack, move to alternate stack,
             call thisfunc, revert stack regs. */
 #ifdef __x86_64__
@@ -1671,8 +1669,6 @@ _cygtls::call_signal_handler ()
                       [FUNC]   "o" (thisfunc)
                   : "memory");
 #endif
-         /* Revert alternate stack to unused. */
-         _my_tls.altstack.ss_flags = 0;
        }
       else
        /* No alternate signal stack requested or available, just call
index 94faaf308a935ca39ea990e2e4753356e86f752d..467c919c3ef182b5edc5993f7a5c4b07798fc345 100644 (file)
@@ -667,7 +667,17 @@ sigaltstack (const stack_t *ss, stack_t *oss)
            }
        }
       if (oss)
-       memcpy (oss, &me.altstack, sizeof *oss);
+       {
+         char stack_marker;
+         memcpy (oss, &me.altstack, sizeof *oss);
+         if (!me.altstack.ss_flags && me.altstack.ss_sp)
+           {
+             if (&stack_marker >= (char *) me.altstack.ss_sp
+                 && &stack_marker < (char *) me.altstack.ss_sp
+                                    + me.altstack.ss_size)
+               oss->ss_flags = SS_ONSTACK;
+           }
+       }
     }
   __except (EFAULT)
     {
This page took 0.034351 seconds and 5 git commands to generate.