summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-12-31 11:50:08 +0000
committerEric Andersen <andersen@codepoet.org>2003-12-31 11:50:08 +0000
commit7c3eb1f4a09caba155e3364ff32cd81a2312eb45 (patch)
tree4b59077686d713b96f7ae519eb56b8af885f2426
parent6373c2b14188d31a3e4a3d7eb917b0479d56f373 (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.c38
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