diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-12-31 11:50:08 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-12-31 11:50:08 +0000 |
commit | 7c3eb1f4a09caba155e3364ff32cd81a2312eb45 (patch) | |
tree | 4b59077686d713b96f7ae519eb56b8af885f2426 | |
parent | 6373c2b14188d31a3e4a3d7eb917b0479d56f373 (diff) |
Add extra checks for sigprocmask and rt_sigprocmask syscalls.
The rt_sigprocmask syscall has broken error handling in 2.4.x
kernels, while the sigprocmask syscall appears to get things
right. Regardless we should be extra careful, and add these
checks.
-rw-r--r-- | libc/sysdeps/linux/common/syscalls.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c index 3c08a853a..1ef7c38b6 100644 --- a/libc/sysdeps/linux/common/syscalls.c +++ b/libc/sysdeps/linux/common/syscalls.c @@ -1427,11 +1427,29 @@ _syscall3(int, mprotect, void *, addr, size_t, len, int, prot); //#define __NR_sigprocmask 126 #ifndef __NR_rt_sigprocmask -#ifdef L_sigprocmask +#ifdef L___syscall_sigprocmask #include <signal.h> -#undef sigprocmask -_syscall3(int, sigprocmask, int, how, const sigset_t *, set, +#define __NR___syscall_sigprocmask __NR_sigprocmask +static inline +_syscall3(int, __syscall_sigprocmask, int, how, const sigset_t *, set, sigset_t *, oldset); +#undef sigprocmask +int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) +{ + if (set && +#if (SIG_BLOCK == 0) && (SIG_UNBLOCK == 1) && (SIG_SETMASK == 2) + (((unsigned int) how) > 2) +#else +#warning "compile time assumption violated.. slow path..." + ((how != SIG_BLOCK) && (how != SIG_UNBLOCK) && (how != SIG_SETMASK)) +#endif + ) + { + __set_errno (EINVAL); + return -1; + } + return(__syscall_sigprocmask(how, set, oldset)); +} #endif #endif @@ -1942,7 +1960,19 @@ _syscall4(int, __rt_sigprocmask, int, how, const sigset_t *, set, int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) { - return __rt_sigprocmask(how, set, oldset, _NSIG/8); + if (set && +#if (SIG_BLOCK == 0) && (SIG_UNBLOCK == 1) && (SIG_SETMASK == 2) + (((unsigned int) how) > 2) +#else +#warning "compile time assumption violated.. slow path..." + ((how != SIG_BLOCK) && (how != SIG_UNBLOCK) && (how != SIG_SETMASK)) +#endif + ) + { + __set_errno (EINVAL); + return -1; + } + return __rt_sigprocmask(how, set, oldset, _NSIG/8); } #endif #endif |