mirror of git://git.musl-libc.org/musl
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:
parent
e31c8c2d79
commit
80bf595255
|
@ -11,6 +11,7 @@ int __pthread_timedjoin_np(pthread_t t, void **res, const struct timespec *at)
|
||||||
__pthread_testcancel();
|
__pthread_testcancel();
|
||||||
__pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
__pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
||||||
if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
|
if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
|
||||||
|
if (t->detached) a_crash();
|
||||||
while ((tmp = t->tid) && r != ETIMEDOUT && r != EINVAL)
|
while ((tmp = t->tid) && r != ETIMEDOUT && r != EINVAL)
|
||||||
r = __timedwait_cp(&t->tid, tmp, CLOCK_REALTIME, at, 0);
|
r = __timedwait_cp(&t->tid, tmp, CLOCK_REALTIME, at, 0);
|
||||||
__pthread_setcancelstate(cs, 0);
|
__pthread_setcancelstate(cs, 0);
|
||||||
|
|
Loading…
Reference in New Issue