From f2c8ddbbe37e354c417b28203bd11f9bd2db72db Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sat, 22 Jun 2024 06:05:40 -0700 Subject: [PATCH] Fix --strace use-after-free in pthread_join() --- libc/intrin/pthread_tid.c | 5 +---- libc/thread/pthread_timedjoin_np.c | 5 ++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libc/intrin/pthread_tid.c b/libc/intrin/pthread_tid.c index 735de54bb51..27e3ee5a121 100644 --- a/libc/intrin/pthread_tid.c +++ b/libc/intrin/pthread_tid.c @@ -22,11 +22,8 @@ #include "libc/thread/thread.h" int _pthread_tid(struct PosixThread *pt) { - if (IsWindows()) // xxx: fixme - return pt->ptid; int tid = 0; - while (pt && !(tid = atomic_load_explicit(&pt->ptid, memory_order_acquire))) { + while (pt && !(tid = atomic_load_explicit(&pt->ptid, memory_order_acquire))) pthread_pause_np(); - } return tid; } diff --git a/libc/thread/pthread_timedjoin_np.c b/libc/thread/pthread_timedjoin_np.c index db5baae7a89..c79428b8dcb 100644 --- a/libc/thread/pthread_timedjoin_np.c +++ b/libc/thread/pthread_timedjoin_np.c @@ -103,10 +103,13 @@ static errno_t _pthread_wait(atomic_int *ctid, struct timespec *abstime) { */ errno_t pthread_timedjoin_np(pthread_t thread, void **value_ptr, struct timespec *abstime) { + int tid; errno_t err; struct PosixThread *pt; enum PosixThreadStatus status; pt = (struct PosixThread *)thread; + tid = _pthread_tid(pt); + unassert(_pthread_tid(pt)); status = atomic_load_explicit(&pt->pt_status, memory_order_acquire); // "The behavior is undefined if the value specified by the thread // argument to pthread_join() does not refer to a joinable thread." @@ -121,7 +124,7 @@ errno_t pthread_timedjoin_np(pthread_t thread, void **value_ptr, } _pthread_unref(pt); } - STRACE("pthread_timedjoin_np(%d, %s, %s) → %s", _pthread_tid(pt), + STRACE("pthread_timedjoin_np(%d, %s, %s) → %s", tid, DescribeReturnValue(alloca(30), err, value_ptr), DescribeTimespec(err ? -1 : 0, abstime), DescribeErrno(err)); return err;