summaryrefslogtreecommitdiff
path: root/src/thread/pthread_kill.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_kill.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_kill.c')
-rw-r--r--src/thread/pthread_kill.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/thread/pthread_kill.c b/src/thread/pthread_kill.c
index 3d9395cb..446254b6 100644
--- a/src/thread/pthread_kill.c
+++ b/src/thread/pthread_kill.c
@@ -4,9 +4,12 @@
int pthread_kill(pthread_t t, int sig)
{
int r;
+ sigset_t set;
+ __block_app_sigs(&set);
LOCK(t->killlock);
r = t->tid ? -__syscall(SYS_tkill, t->tid, sig)
: (sig+0U >= _NSIG ? EINVAL : 0);
UNLOCK(t->killlock);
+ __restore_sigs(&set);
return r;
}