diff options
author | Rich Felker <dalias@aerifal.cx> | 2017-08-11 20:42:30 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2017-08-11 20:42:30 -0400 |
commit | 80bf5952551c002cf12d96deb145629765272db0 (patch) | |
tree | cd5d18ba17103d6b979e521d00dc86d79d0cb749 /src/thread | |
parent | e31c8c2d796e8a9596503f079dc567c45f93c2ae (diff) | |
download | musl-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.c | 1 |
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); |