diff --git a/arch/i386/bits/signal.h b/arch/i386/bits/signal.h index 4956a0d91c7143ad0d46936bf2946b66714e0658..74d9d025a9093f644b1c4f099c94699729e5f052 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 f2c92d09af0651b79e5b19e05b908d91338ce934..ddebe90d0b3416f84839c813f1469cae68312ed5 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 3cc2d456b3bb572a6dc6af926b6a4ddc6a198762..6e46d098e43b02c1d7a68575620c6a3018eca682 100644 --- a/src/signal/sigaltstack.c +++ b/src/signal/sigaltstack.c @@ -1,8 +1,18 @@ #include +#include #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); }