+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
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__
[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
}
}
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)
{