make sigaltstack work (missing macros in signal.h, error conditions)
authorRich Felker <dalias@aerifal.cx>
Thu, 10 Mar 2011 15:17:29 +0000 (10:17 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 10 Mar 2011 15:17:29 +0000 (10:17 -0500)
arch/i386/bits/signal.h
arch/x86_64/bits/signal.h
src/signal/sigaltstack.c

index 4956a0d91c7143ad0d46936bf2946b66714e0658..74d9d025a9093f644b1c4f099c94699729e5f052 100644 (file)
@@ -131,6 +131,8 @@ struct __siginfo
 #define POLL_HUP 6
 #define SS_ONSTACK    1
 #define SS_DISABLE    2
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
 #endif
 
 #define SA_NOCLDSTOP  1
index f2c92d09af0651b79e5b19e05b908d91338ce934..ddebe90d0b3416f84839c813f1469cae68312ed5 100644 (file)
@@ -137,6 +137,8 @@ struct __siginfo
 #define POLL_HUP 6
 #define SS_ONSTACK    1
 #define SS_DISABLE    2
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
 #endif
 
 #define SA_NOCLDSTOP  1
index 3cc2d456b3bb572a6dc6af926b6a4ddc6a198762..6e46d098e43b02c1d7a68575620c6a3018eca682 100644 (file)
@@ -1,8 +1,18 @@
 #include <signal.h>
+#include <errno.h>
 #include "syscall.h"
 
 int sigaltstack(const stack_t *ss, stack_t *old)
 {
-       /* depends on kernel struct matching */
+       if (ss) {
+               if (ss->ss_size < MINSIGSTKSZ) {
+                       errno = ENOMEM;
+                       return -1;
+               }
+               if (ss->ss_flags & ~SS_DISABLE) {
+                       errno = EINVAL;
+                       return -1;
+               }
+       }
        return syscall2(__NR_sigaltstack, (long)ss, (long)old);
 }