about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2013-10-01 20:35:28 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2013-10-01 20:35:28 +0530
commitad4e70da03353444aad95a4fbbd03cef2b750647 (patch)
treeb7fd16e0cdb2f30deb7e3cb37c02d13fb39f9f83
parentfd96752258901457148b702093a34a3d8c0fb7db (diff)
downloadglibc-ad4e70da03353444aad95a4fbbd03cef2b750647.tar.gz
glibc-ad4e70da03353444aad95a4fbbd03cef2b750647.tar.xz
glibc-ad4e70da03353444aad95a4fbbd03cef2b750647.zip
Fix PI mutex check in pthread_cond_broadcast and pthread_cond_signal
Fixes BZ #15988.

The check had a typo - it checked for PTHREAD_MUTEX_ROBUST_NP instead
of PTHREAD_MUTEX_ROBUST_NORMAL_NP.  It has now been replaced by the
already existing convenience macro USE_REQUEUE_PI.
-rw-r--r--NEWS2
-rw-r--r--nptl/ChangeLog9
-rw-r--r--nptl/pthread_cond_broadcast.c5
-rw-r--r--nptl/pthread_cond_signal.c7
4 files changed, 12 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index acd0ca5873..37b2a113ac 100644
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,7 @@ Version 2.19
   15608, 15609, 15610, 15640, 15681, 15736, 15748, 15749, 15754, 15797,
   15844, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890,
   15892, 15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939,
-  15963, 15966.
+  15963, 15966, 15988.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 9f25dfe2ae..29469fcd91 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,12 @@
+2013-10-01  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+	[BZ #15988]
+	* pthread_cond_broadcast.c (__pthread_cond_broadcast)
+	[lll_futex_cmp_requeue_pi && __ASSUME_REQUEUE_PI]: Use
+	USE_REQUEUE_PI.
+	* pthread_cond_signal.c (__pthread_cond_signal)
+	[lll_futex_cmd_requeue_pi && __ASSUME_REQUEUE_PI]: Likewise.
+
 2013-09-27  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
 	* sysdeps/pthread/bits/libc-lock.h [_LIBC && (!NOT_IN_libc ||
diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c
index 0702ec0ec2..7ba9efa0c0 100644
--- a/nptl/pthread_cond_broadcast.c
+++ b/nptl/pthread_cond_broadcast.c
@@ -63,10 +63,7 @@ __pthread_cond_broadcast (cond)
 
 #if (defined lll_futex_cmp_requeue_pi \
      && defined __ASSUME_REQUEUE_PI)
-      int pi_flag = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_NP;
-      pi_flag &= mut->__data.__kind;
-
-      if (pi_flag == PTHREAD_MUTEX_PRIO_INHERIT_NP)
+      if (USE_REQUEUE_PI (mut))
 	{
 	  if (lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, INT_MAX,
 					&mut->__data.__lock, futex_val,
diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c
index 102d0b380c..ffc35dc9e1 100644
--- a/nptl/pthread_cond_signal.c
+++ b/nptl/pthread_cond_signal.c
@@ -49,14 +49,9 @@ __pthread_cond_signal (cond)
 
 #if (defined lll_futex_cmp_requeue_pi \
      && defined __ASSUME_REQUEUE_PI)
-      int pi_flag = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_NP;
       pthread_mutex_t *mut = cond->__data.__mutex;
 
-      /* Do not use requeue for pshared condvars.  */
-      if (mut != (void *) ~0l)
-	pi_flag &= mut->__data.__kind;
-
-      if (__builtin_expect (pi_flag == PTHREAD_MUTEX_PRIO_INHERIT_NP, 0)
+      if (USE_REQUEUE_PI (mut)
 	/* This can only really fail with a ENOSYS, since nobody can modify
 	   futex while we have the cond_lock.  */
 	  && lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, 0,