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/thread/pthread_create.c | 6 ++++-- src/thread/pthread_self.c | 3 ++- src/thread/pthread_sigmask.c | 4 ++-- src/thread/synccall.c | 6 ++++-- 4 files changed, 12 insertions(+), 7 deletions(-) (limited to 'src/thread') diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 94dc308d..52b48d6f 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -38,7 +38,8 @@ void pthread_exit(void *result) if (self->detached && self->map_base) { if (self->detached == 2) __syscall(SYS_set_tid_address, 0); - __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1},0,8); + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, + SIGALL_SET, 0, __SYSCALL_SSLEN); __unmapself(self->map_base, self->map_size); } @@ -61,7 +62,8 @@ static int start(void *p) { pthread_t self = p; if (self->unblock_cancel) - __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, 8); + __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, + SIGPT_SET, 0, __SYSCALL_SSLEN); pthread_exit(self->start(self->start_arg)); return 0; } diff --git a/src/thread/pthread_self.c b/src/thread/pthread_self.c index f68896f7..a8cc80b5 100644 --- a/src/thread/pthread_self.c +++ b/src/thread/pthread_self.c @@ -8,7 +8,8 @@ weak_alias(dummy, __pthread_tsd_main); static int init_main_thread() { - __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, 8); + __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, + SIGPT_SET, 0, __SYSCALL_SSLEN); if (__set_thread_area(&main_thread) < 0) return -1; main_thread.canceldisable = libc.canceldisable; main_thread.tsd = (void **)__pthread_tsd_main; diff --git a/src/thread/pthread_sigmask.c b/src/thread/pthread_sigmask.c index decc38f8..cddc2bca 100644 --- a/src/thread/pthread_sigmask.c +++ b/src/thread/pthread_sigmask.c @@ -6,8 +6,8 @@ int pthread_sigmask(int how, const sigset_t *set, sigset_t *old) { int ret; - if (how > 2U) return EINVAL; - ret = -__syscall(SYS_rt_sigprocmask, how, set, old, 8); + if ((unsigned)how - SIG_BLOCK > 2U) return EINVAL; + ret = -__syscall(SYS_rt_sigprocmask, how, set, old, __SYSCALL_SSLEN); if (!ret && old) { if (sizeof old->__bits[0] == 8) { old->__bits[0] &= ~0x380000000ULL; diff --git a/src/thread/synccall.c b/src/thread/synccall.c index 1520b3b4..fd377cb3 100644 --- a/src/thread/synccall.c +++ b/src/thread/synccall.c @@ -61,7 +61,8 @@ void __synccall(void (*func)(void *), void *ctx) pthread_rwlock_wrlock(&lock); - __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1}, &oldmask, 8); + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGALL_SET, + &oldmask, __SYSCALL_SSLEN); sem_init(&chaindone, 0, 0); sem_init(&chainlock, 0, 1); @@ -93,7 +94,8 @@ void __synccall(void (*func)(void *), void *ctx) sa.sa_handler = SIG_IGN; __libc_sigaction(SIGSYNCCALL, &sa, 0); - __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &oldmask, 0, 8); + __syscall(SYS_rt_sigprocmask, SIG_SETMASK, + &oldmask, 0, __SYSCALL_SSLEN); pthread_rwlock_unlock(&lock); } -- cgit v1.2.1