diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-04-03 13:15:42 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-04-03 13:15:42 -0400 |
commit | 66def4e776a0c6d68559309aa043163f77b148a5 (patch) | |
tree | cea9fd1829b26fd47ee4ae6333da5db44eb2c47a /src/thread | |
parent | 1ad049b7b60b2c1704b8bb5b94ee4f95d7540b3a (diff) | |
download | musl-66def4e776a0c6d68559309aa043163f77b148a5.tar.gz |
block all signals during rsyscall
otherwise a signal handler could see an inconsistent and nonconformant
program state where different threads have different uids/gids.
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/pthread_create.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 344b39f8..cdf36ff2 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -85,7 +85,7 @@ static void rsyscall_handler(int sig, siginfo_t *si, void *ctx) /* Threads which have already decremented themselves from the * thread count must not increment rs.cnt or otherwise act. */ if (self->dead) { - sigaddset(&((ucontext_t *)ctx)->uc_sigmask, SIGSYSCALL); + sigfillset(&((ucontext_t *)ctx)->uc_sigmask); return; } @@ -151,13 +151,18 @@ static void init_threads() libc.lockfile = __lockfile; libc.cancelpt = cancelpt; libc.rsyscall = rsyscall; + + sigfillset(&sa.sa_mask); + sa.sa_sigaction = rsyscall_handler; + __libc_sigaction(SIGSYSCALL, &sa, 0); + + sigemptyset(&sa.sa_mask); sa.sa_sigaction = cancel_handler; __libc_sigaction(SIGCANCEL, &sa, 0); + sigaddset(&sa.sa_mask, SIGSYSCALL); sigaddset(&sa.sa_mask, SIGCANCEL); - sa.sa_sigaction = rsyscall_handler; - __libc_sigaction(SIGSYSCALL, &sa, 0); - sigprocmask(SIG_UNBLOCK, &sa.sa_mask, 0); + __libc_sigprocmask(SIG_UNBLOCK, &sa.sa_mask, 0); } static int start(void *p) |