From 80bf5952551c002cf12d96deb145629765272db0 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 11 Aug 2017 20:42:30 -0400 Subject: 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. --- src/thread/pthread_join.c | 1 + 1 file changed, 1 insertion(+) 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); -- cgit v1.2.1