Fix --strace use-after-free in pthread_join()

This commit is contained in:
Justine Tunney 2024-06-22 06:05:40 -07:00
parent d1d4388201
commit f2c8ddbbe3
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
2 changed files with 5 additions and 5 deletions

View file

@ -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;
}

View file

@ -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;