about summary refs log tree commit diff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-09-27 18:17:27 -0400
committerRich Felker <dalias@aerifal.cx>2011-09-27 18:17:27 -0400
commitbfae1a8b713305ec3e65c7d6abd7ad64d5df6363 (patch)
treea3ee0f3bad28bb0b879f78ab08b44027d95ebdd8 /src/thread
parentd8dc1df1c2aa461d094d3cfe97e2cc68dd331e6e (diff)
downloadmusl-bfae1a8b713305ec3e65c7d6abd7ad64d5df6363.tar.gz
musl-bfae1a8b713305ec3e65c7d6abd7ad64d5df6363.tar.xz
musl-bfae1a8b713305ec3e65c7d6abd7ad64d5df6363.zip
check mutex owner in pthread_cond_wait
when used with error-checking mutexes, pthread_cond_wait is required
to fail with EPERM if the mutex is not locked by the caller.
previously we relied on pthread_mutex_unlock to generate the error,
but this is not valid, since in the case of such invalid usage the
internal state of the cond variable has already been potentially
corrupted (due to access outside the control of the mutex). thus, we
have to check first.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/pthread_cond_timedwait.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/thread/pthread_cond_timedwait.c b/src/thread/pthread_cond_timedwait.c
index db2744ba..faa7c23b 100644
--- a/src/thread/pthread_cond_timedwait.c
+++ b/src/thread/pthread_cond_timedwait.c
@@ -37,6 +37,9 @@ int pthread_cond_timedwait(pthread_cond_t *c, pthread_mutex_t *m, const struct t
 	struct cm cm = { .c=c, .m=m };
 	int r, e=0, seq;
 
+	if ((m->_m_type&3) == PTHREAD_MUTEX_ERRORCHECK &&
+		(m->_m_lock&INT_MAX) != __pthread_self()->tid) return EPERM;
+
 	if (ts && ts->tv_nsec >= 1000000000UL)
 		return EINVAL;