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.
This commit is contained in:
Rich Felker 2017-08-11 20:42:30 -04:00
parent e31c8c2d79
commit 80bf595255
1 changed files with 1 additions and 0 deletions

View File

@ -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);