aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/signal.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-06-20 18:48:09 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-06-20 18:48:09 +0200
commit74d272cc0272d89b9735d9a549102170fab37333 (patch)
treee316c9d9a25cf3166762ab3ab6da727fbfee71c3 /winsup/cygwin/signal.cc
parent22465796edbfd6f156ca2930f56b3345cc54b164 (diff)
downloadnewlib-74d272cc0272d89b9735d9a549102170fab37333.zip
newlib-74d272cc0272d89b9735d9a549102170fab37333.tar.gz
newlib-74d272cc0272d89b9735d9a549102170fab37333.tar.bz2
Handle exceptions in sigaltstack
* signal.cc (sigaltstack): Add fault handler. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/signal.cc')
-rw-r--r--winsup/cygwin/signal.cc56
1 files changed, 35 insertions, 21 deletions
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 7cb668c..94faaf3 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -630,35 +630,49 @@ sigaltstack (const stack_t *ss, stack_t *oss)
{
_cygtls& me = _my_tls;
- if (ss)
+ __try
{
- if (me.altstack.ss_flags == SS_ONSTACK)
- {
- set_errno (EPERM);
- 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)
{
- if (ss->ss_flags)
+ if (me.altstack.ss_flags == SS_ONSTACK)
{
- set_errno (EINVAL);
+ /* An attempt was made to modify an active stack. */
+ set_errno (EPERM);
return -1;
}
- if (ss->ss_size < MINSIGSTKSZ)
+ if (ss->ss_flags == SS_DISABLE)
{
- set_errno (ENOMEM);
- return -1;
+ me.altstack.ss_sp = NULL;
+ 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)
- memcpy (oss, &me.altstack, sizeof *oss);
+ __except (EFAULT)
+ {
+ return EFAULT;
+ }
+ __endtry
return 0;
}