diff options
author | Rich Felker <dalias@aerifal.cx> | 2020-07-06 17:56:19 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-07-06 17:56:19 -0400 |
commit | 7cc9496a18c3fa665c286b8be41d790c795e0171 (patch) | |
tree | 8d2d2e901495af4692d3b5cbd50a71e7d679f8dd /src/thread/pthread_setschedprio.c | |
parent | 0a005f499cf39822166dd4db3d2d31f0639f1b1b (diff) | |
download | musl-7cc9496a18c3fa665c286b8be41d790c795e0171.tar.gz musl-7cc9496a18c3fa665c286b8be41d790c795e0171.tar.bz2 musl-7cc9496a18c3fa665c286b8be41d790c795e0171.tar.xz musl-7cc9496a18c3fa665c286b8be41d790c795e0171.zip |
make thread killlock async-signal-safe for pthread_kill
pthread_kill is required to be AS-safe. that requirement can't be met
if the target thread's killlock can be taken in contexts where
application-installed signal handlers can run.
block signals around use of this lock in all pthread_* functions which
target a tid, and reorder blocking/unblocking of signals in
pthread_exit so that they're blocked whenever the killlock is held.
Diffstat (limited to 'src/thread/pthread_setschedprio.c')
-rw-r--r-- | src/thread/pthread_setschedprio.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/thread/pthread_setschedprio.c b/src/thread/pthread_setschedprio.c index 5bf4a019..fc2e13dd 100644 --- a/src/thread/pthread_setschedprio.c +++ b/src/thread/pthread_setschedprio.c @@ -4,8 +4,11 @@ int pthread_setschedprio(pthread_t t, int prio) { int r; + sigset_t set; + __block_app_sigs(&set); LOCK(t->killlock); r = !t->tid ? ESRCH : -__syscall(SYS_sched_setparam, t->tid, &prio); UNLOCK(t->killlock); + __restore_sigs(&set); return r; } |