From 2f437040e7911d9bef239588ea7ed6f4b9102922 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 9 Aug 2012 22:52:13 -0400 Subject: fix (hopefully) all hard-coded 8's for kernel sigset_t size some minor changes to how hard-coded sets for thread-related purposes are handled were also needed, since the old object sizes were not necessarily sufficient. things have gotten a bit ugly in this area, and i think a cleanup is in order at some point, but for now the goal is just to get the code working on all supported archs including mips, which was badly broken by linux rejecting syscalls with the wrong sigset_t size. --- src/signal/raise.c | 5 +++-- src/signal/siglongjmp.c | 4 ++-- src/signal/sigpending.c | 2 +- src/signal/sigsuspend.c | 2 +- src/signal/sigtimedwait.c | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) (limited to 'src/signal') diff --git a/src/signal/raise.c b/src/signal/raise.c index 71e0505b..c0814fad 100644 --- a/src/signal/raise.c +++ b/src/signal/raise.c @@ -2,15 +2,16 @@ #include #include #include "syscall.h" +#include "pthread_impl.h" int raise(int sig) { int pid, tid, ret; sigset_t set; - __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1}, &set, 8); + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGALL_SET, &set, __SYSCALL_SSLEN); tid = syscall(SYS_gettid); pid = syscall(SYS_getpid); ret = syscall(SYS_tgkill, pid, tid, sig); - __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &set, 0, 8); + __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &set, 0, __SYSCALL_SSLEN); return ret; } diff --git a/src/signal/siglongjmp.c b/src/signal/siglongjmp.c index 9b4a5398..e9a61314 100644 --- a/src/signal/siglongjmp.c +++ b/src/signal/siglongjmp.c @@ -5,7 +5,7 @@ void siglongjmp(sigjmp_buf buf, int ret) { - if (buf->__fl) - __syscall(SYS_rt_sigprocmask, SIG_SETMASK, buf->__ss, 0, 8); + if (buf->__fl) __syscall(SYS_rt_sigprocmask, SIG_SETMASK, + buf->__ss, 0, __SYSCALL_SSLEN); longjmp(buf->__jb, ret); } diff --git a/src/signal/sigpending.c b/src/signal/sigpending.c index f6b8972e..46ce3036 100644 --- a/src/signal/sigpending.c +++ b/src/signal/sigpending.c @@ -3,5 +3,5 @@ int sigpending(sigset_t *set) { - return syscall(SYS_rt_sigpending, set, 8); + return syscall(SYS_rt_sigpending, set, __SYSCALL_SSLEN); } diff --git a/src/signal/sigsuspend.c b/src/signal/sigsuspend.c index cd3a7b59..bdfaeee0 100644 --- a/src/signal/sigsuspend.c +++ b/src/signal/sigsuspend.c @@ -4,5 +4,5 @@ int sigsuspend(const sigset_t *mask) { - return syscall_cp(SYS_rt_sigsuspend, mask, 8); + return syscall_cp(SYS_rt_sigsuspend, mask, __SYSCALL_SSLEN); } diff --git a/src/signal/sigtimedwait.c b/src/signal/sigtimedwait.c index 7eea58ab..f62db2f3 100644 --- a/src/signal/sigtimedwait.c +++ b/src/signal/sigtimedwait.c @@ -6,7 +6,8 @@ int sigtimedwait(const sigset_t *mask, siginfo_t *si, const struct timespec *timeout) { int ret; - do ret = syscall_cp(SYS_rt_sigtimedwait, mask, si, timeout, 8); + do ret = syscall_cp(SYS_rt_sigtimedwait, mask, + si, timeout, __SYSCALL_SSLEN); while (ret<0 && errno==EINTR); return ret; } -- cgit v1.2.1