summaryrefslogtreecommitdiffstats
path: root/lib/librthread
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2013-04-06 04:25:01 +0000
committertedu <tedu@openbsd.org>2013-04-06 04:25:01 +0000
commite9a37ca06ee413eeb5d24488bca9b384f215a0ca (patch)
tree287f964d60801d72040d60f919d14746bc0fcc35 /lib/librthread
parentshuffle around some poison code, prototypes, values... (diff)
downloadwireguard-openbsd-e9a37ca06ee413eeb5d24488bca9b384f215a0ca.tar.xz
wireguard-openbsd-e9a37ca06ee413eeb5d24488bca9b384f215a0ca.zip
fix race when exiting a detached thread. observed by and ok guenther
Diffstat (limited to 'lib/librthread')
-rw-r--r--lib/librthread/rthread.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/librthread/rthread.c b/lib/librthread/rthread.c
index 5952375d128..49b4f1ddd14 100644
--- a/lib/librthread/rthread.c
+++ b/lib/librthread/rthread.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rthread.c,v 1.68 2013/02/15 22:01:24 guenther Exp $ */
+/* $OpenBSD: rthread.c,v 1.69 2013/04/06 04:25:01 tedu Exp $ */
/*
* Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org>
* All Rights Reserved.
@@ -317,10 +317,13 @@ pthread_exit(void *retval)
#else
thread->arg = __get_tcb();
#endif
- if (thread->flags & THREAD_DETACHED)
+ _spinlock(&thread->flags_lock);
+ if (thread->flags & THREAD_DETACHED) {
+ _spinunlock(&thread->flags_lock);
_rthread_free(thread);
- else {
- _rthread_setflag(thread, THREAD_DONE);
+ } else {
+ thread->flags |= THREAD_DONE;
+ _spinunlock(&thread->flags_lock);
_sem_post(&thread->donesem);
}