overhaul implementation-internal signal protections
[musl] / src / thread / pthread_create.c
index 6f790f5..6545539 100644 (file)
@@ -5,11 +5,7 @@ static void dummy_0()
 }
 weak_alias(dummy_0, __rsyscall_lock);
 weak_alias(dummy_0, __rsyscall_unlock);
-
-static void dummy_1(pthread_t self)
-{
-}
-weak_alias(dummy_1, __pthread_tsd_run_dtors);
+weak_alias(dummy_0, __pthread_tsd_run_dtors);
 
 #ifdef __pthread_unwind_next
 #undef __pthread_unwind_next
@@ -28,7 +24,7 @@ void __pthread_unwind_next(struct __ptcb *cb)
 
        LOCK(&self->exitlock);
 
-       __pthread_tsd_run_dtors(self);
+       __pthread_tsd_run_dtors();
 
        /* Mark this thread dead before decrementing count */
        self->dead = 1;
@@ -38,7 +34,7 @@ void __pthread_unwind_next(struct __ptcb *cb)
        if (!n) exit(0);
 
        if (self->detached && self->map_base) {
-               __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (long)(uint64_t[1]){-1},0,8);
+               __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1},0,8);
                __unmapself(self->map_base, self->map_size);
        }
 
@@ -48,12 +44,8 @@ void __pthread_unwind_next(struct __ptcb *cb)
 static int start(void *p)
 {
        struct pthread *self = p;
-       if (self->unblock_cancel) {
-               sigset_t set;
-               sigemptyset(&set);
-               sigaddset(&set, SIGCANCEL);
-               __libc_sigprocmask(SIG_UNBLOCK, &set, 0);
-       }
+       if (self->unblock_cancel)
+               __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, &SIGPT_SET, 0, 8);
        pthread_exit(self->start(self->start_arg));
        return 0;
 }
@@ -76,11 +68,7 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
 
        if (!self) return ENOSYS;
        if (!libc.threaded) {
-               sigset_t set;
-               sigemptyset(&set);
-               sigaddset(&set, SIGSYSCALL);
-               sigaddset(&set, SIGCANCEL);
-               __libc_sigprocmask(SIG_UNBLOCK, &set, 0);
+               __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, &SIGPT_SET, 0, 8);
                libc.threaded = 1;
        }