Browse Source

make sigaltstack work (missing macros in signal.h, error conditions)

Rich Felker 14 years ago
parent
commit
6871fd773d
3 changed files with 15 additions and 1 deletions
  1. 2 0
      arch/i386/bits/signal.h
  2. 2 0
      arch/x86_64/bits/signal.h
  3. 11 1
      src/signal/sigaltstack.c

+ 2 - 0
arch/i386/bits/signal.h

@@ -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

+ 2 - 0
arch/x86_64/bits/signal.h

@@ -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

+ 11 - 1
src/signal/sigaltstack.c

@@ -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);
 }