Handle exceptions in sigaltstack
* signal.cc (sigaltstack): Add fault handler. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
22465796ed
commit
74d272cc02
@ -630,35 +630,49 @@ sigaltstack (const stack_t *ss, stack_t *oss)
|
|||||||
{
|
{
|
||||||
_cygtls& me = _my_tls;
|
_cygtls& me = _my_tls;
|
||||||
|
|
||||||
if (ss)
|
__try
|
||||||
{
|
{
|
||||||
if (me.altstack.ss_flags == SS_ONSTACK)
|
if (ss)
|
||||||
{
|
{
|
||||||
set_errno (EPERM);
|
if (me.altstack.ss_flags == SS_ONSTACK)
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ss->ss_flags == SS_DISABLE)
|
|
||||||
{
|
|
||||||
me.altstack.ss_sp = NULL;
|
|
||||||
me.altstack.ss_flags = 0;
|
|
||||||
me.altstack.ss_size = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (ss->ss_flags)
|
|
||||||
{
|
{
|
||||||
set_errno (EINVAL);
|
/* An attempt was made to modify an active stack. */
|
||||||
|
set_errno (EPERM);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (ss->ss_size < MINSIGSTKSZ)
|
if (ss->ss_flags == SS_DISABLE)
|
||||||
{
|
{
|
||||||
set_errno (ENOMEM);
|
me.altstack.ss_sp = NULL;
|
||||||
return -1;
|
me.altstack.ss_flags = 0;
|
||||||
|
me.altstack.ss_size = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ss->ss_flags)
|
||||||
|
{
|
||||||
|
/* The ss argument is not a null pointer, and the ss_flags
|
||||||
|
member pointed to by ss contains flags other than
|
||||||
|
SS_DISABLE. */
|
||||||
|
set_errno (EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (ss->ss_size < MINSIGSTKSZ)
|
||||||
|
{
|
||||||
|
/* The size of the alternate stack area is less than
|
||||||
|
MINSIGSTKSZ. */
|
||||||
|
set_errno (ENOMEM);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy (&me.altstack, ss, sizeof *ss);
|
||||||
}
|
}
|
||||||
memcpy (&me.altstack, ss, sizeof *ss);
|
|
||||||
}
|
}
|
||||||
|
if (oss)
|
||||||
|
memcpy (oss, &me.altstack, sizeof *oss);
|
||||||
}
|
}
|
||||||
if (oss)
|
__except (EFAULT)
|
||||||
memcpy (oss, &me.altstack, sizeof *oss);
|
{
|
||||||
|
return EFAULT;
|
||||||
|
}
|
||||||
|
__endtry
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user