trap UB from attempts to join a detached thread
authorRich Felker <dalias@aerifal.cx>
Sat, 12 Aug 2017 00:42:30 +0000 (20:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 12 Aug 2017 00:42:30 +0000 (20:42 -0400)
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

index 52111489540eda91809d6be7ab2a6a704c09dcd3..b7175c0937c15177d56b4a48b401db4d0d163092 100644 (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);