about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-03-10 10:17:29 -0500
committerRich Felker <dalias@aerifal.cx>2011-03-10 10:17:29 -0500
commit6871fd773dcedbf056317d5d5e87b4859e97c4a4 (patch)
tree94431cd8088870491de1d5e82a380aca96c28920
parent1b538acb0ac8520a8a5fd828add2e52e1d2a41eb (diff)
downloadmusl-6871fd773dcedbf056317d5d5e87b4859e97c4a4.tar.gz
musl-6871fd773dcedbf056317d5d5e87b4859e97c4a4.tar.xz
musl-6871fd773dcedbf056317d5d5e87b4859e97c4a4.zip
make sigaltstack work (missing macros in signal.h, error conditions)
-rw-r--r--arch/i386/bits/signal.h2
-rw-r--r--arch/x86_64/bits/signal.h2
-rw-r--r--src/signal/sigaltstack.c12
3 files changed, 15 insertions, 1 deletions
diff --git a/arch/i386/bits/signal.h b/arch/i386/bits/signal.h
index 4956a0d9..74d9d025 100644
--- a/arch/i386/bits/signal.h
+++ b/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
diff --git a/arch/x86_64/bits/signal.h b/arch/x86_64/bits/signal.h
index f2c92d09..ddebe90d 100644
--- a/arch/x86_64/bits/signal.h
+++ b/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
diff --git a/src/signal/sigaltstack.c b/src/signal/sigaltstack.c
index 3cc2d456..6e46d098 100644
--- a/src/signal/sigaltstack.c
+++ b/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);
 }