This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Handle exceptions in sigaltstack


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=74d272cc0272d89b9735d9a549102170fab37333

commit 74d272cc0272d89b9735d9a549102170fab37333
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Sat Jun 20 18:48:09 2015 +0200

    Handle exceptions in sigaltstack
    
    	* signal.cc (sigaltstack): Add fault handler.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/signal.cc | 56 ++++++++++++++++++++++++++++++-------------------
 1 file 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;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]