about summary refs log tree commit diff
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
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_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;
 }