summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2017-08-11 20:42:30 -0400
committerRich Felker <dalias@aerifal.cx>2017-08-11 20:42:30 -0400
commit80bf5952551c002cf12d96deb145629765272db0 (patch)
treecd5d18ba17103d6b979e521d00dc86d79d0cb749 /src/thread
parente31c8c2d796e8a9596503f079dc567c45f93c2ae (diff)
downloadmusl-80bf5952551c002cf12d96deb145629765272db0.tar.gz
trap UB from attempts to join a detached thread
passing to pthread_join the id of a thread which is not joinable results in undefined behavior. in principle the check to trap does not necessarily work if pthread_detach was called after thread creation, since no effort is made here to synchronize access to t->detached, but the check is well-defined and harmless for callers which did not invoke UB, and likely to help catch erroneous code that would otherwise mysteriously hang. patch by William Pitcock.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/pthread_join.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c
index 52111489..b7175c09 100644
--- a/src/thread/pthread_join.c
+++ b/src/thread/pthread_join.c
@@ -11,6 +11,7 @@ int __pthread_timedjoin_np(pthread_t t, void **res, const struct timespec *at)
__pthread_testcancel();
__pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
+ if (t->detached) a_crash();
while ((tmp = t->tid) && r != ETIMEDOUT && r != EINVAL)
r = __timedwait_cp(&t->tid, tmp, CLOCK_REALTIME, at, 0);
__pthread_setcancelstate(cs, 0);