Handle ss_flags value longjmp safe.
* 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>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user