mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
Fix --strace use-after-free in pthread_join()
This commit is contained in:
parent
d1d4388201
commit
f2c8ddbbe3
2 changed files with 5 additions and 5 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue