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.
This commit is contained in:
Siddhesh Poyarekar 2013-10-01 20:35:28 +05:30
parent fd96752258
commit ad4e70da03
4 changed files with 12 additions and 11 deletions

2
NEWS
View File

@ -13,7 +13,7 @@ Version 2.19
15608, 15609, 15610, 15640, 15681, 15736, 15748, 15749, 15754, 15797, 15608, 15609, 15610, 15640, 15681, 15736, 15748, 15749, 15754, 15797,
15844, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15844, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890,
15892, 15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 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 * CVE-2012-4412 The strcoll implementation caches indices and rules for
large collation sequences to optimize multiple passes. This cache large collation sequences to optimize multiple passes. This cache

View File

@ -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> 2013-09-27 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/pthread/bits/libc-lock.h [_LIBC && (!NOT_IN_libc || * sysdeps/pthread/bits/libc-lock.h [_LIBC && (!NOT_IN_libc ||

View File

@ -63,10 +63,7 @@ __pthread_cond_broadcast (cond)
#if (defined lll_futex_cmp_requeue_pi \ #if (defined lll_futex_cmp_requeue_pi \
&& defined __ASSUME_REQUEUE_PI) && defined __ASSUME_REQUEUE_PI)
int pi_flag = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_NP; if (USE_REQUEUE_PI (mut))
pi_flag &= mut->__data.__kind;
if (pi_flag == PTHREAD_MUTEX_PRIO_INHERIT_NP)
{ {
if (lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, INT_MAX, if (lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, INT_MAX,
&mut->__data.__lock, futex_val, &mut->__data.__lock, futex_val,

View File

@ -49,14 +49,9 @@ __pthread_cond_signal (cond)
#if (defined lll_futex_cmp_requeue_pi \ #if (defined lll_futex_cmp_requeue_pi \
&& defined __ASSUME_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; pthread_mutex_t *mut = cond->__data.__mutex;
/* Do not use requeue for pshared condvars. */ if (USE_REQUEUE_PI (mut)
if (mut != (void *) ~0l)
pi_flag &= mut->__data.__kind;
if (__builtin_expect (pi_flag == PTHREAD_MUTEX_PRIO_INHERIT_NP, 0)
/* This can only really fail with a ENOSYS, since nobody can modify /* This can only really fail with a ENOSYS, since nobody can modify
futex while we have the cond_lock. */ futex while we have the cond_lock. */
&& lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, 0, && lll_futex_cmp_requeue_pi (&cond->__data.__futex, 1, 0,