Skip to content

Commit

Permalink
Fix --strace use-after-free in pthread_join()
Browse files Browse the repository at this point in the history
  • Loading branch information
jart committed Jun 22, 2024
1 parent d1d4388 commit f2c8ddb
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
5 changes: 1 addition & 4 deletions libc/intrin/pthread_tid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
5 changes: 4 additions & 1 deletion libc/thread/pthread_timedjoin_np.c
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand All @@ -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;
Expand Down

0 comments on commit f2c8ddb

Please sign in to comment.