summaryrefslogtreecommitdiff
path: root/src/thread/pthread_getschedparam.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2020-07-06 17:56:19 -0400
committerRich Felker <dalias@aerifal.cx>2020-07-06 17:56:19 -0400
commit7cc9496a18c3fa665c286b8be41d790c795e0171 (patch)
tree8d2d2e901495af4692d3b5cbd50a71e7d679f8dd /src/thread/pthread_getschedparam.c
parent0a005f499cf39822166dd4db3d2d31f0639f1b1b (diff)
downloadmusl-7cc9496a18c3fa665c286b8be41d790c795e0171.tar.gz
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_getschedparam.c')
-rw-r--r--src/thread/pthread_getschedparam.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/thread/pthread_getschedparam.c b/src/thread/pthread_getschedparam.c
index 1cba073d..c098befb 100644
--- a/src/thread/pthread_getschedparam.c
+++ b/src/thread/pthread_getschedparam.c
@@ -4,6 +4,8 @@
int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param *restrict param)
{
int r;
+ sigset_t set;
+ __block_app_sigs(&set);
LOCK(t->killlock);
if (!t->tid) {
r = ESRCH;
@@ -14,5 +16,6 @@ int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param
}
}
UNLOCK(t->killlock);
+ __restore_sigs(&set);
return r;
}