about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYang Yingliang <yangyingliang@huawei.com>2014-04-30 15:46:18 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-04-30 15:46:19 +0530
commit8f630cca5c36941db1cb48726016bbed80ec1041 (patch)
tree68086952458460cb91dabb70b87a63c35bf83112
parentbc8f194c8c29e46e8ee4034f06e46988dfff38f7 (diff)
downloadglibc-8f630cca5c36941db1cb48726016bbed80ec1041.tar.gz
glibc-8f630cca5c36941db1cb48726016bbed80ec1041.tar.xz
glibc-8f630cca5c36941db1cb48726016bbed80ec1041.zip
Fix lll_unlock twice in pthread_cond_broadcast
lll_unlock() will be called again if it goes to "wake_all" in
pthread_cond_broadcast(). This may make another thread which is
waiting for lock in pthread_cond_timedwait() unlock.  So there are
more than one threads get the lock, it will break the shared data.

It's introduced by commit 8313cb997d2d("FUTEX_*_REQUEUE_PI support for
non-x86 code")
-rw-r--r--ChangeLog5
-rw-r--r--nptl/pthread_cond_broadcast.c1
2 files changed, 6 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b0821fd27..6bacb5c25d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-04-30  Yang Yingliang  <yangyingliang@huawei.com>
+
+	* nptl/pthread_cond_broadcast.c (__pthread_cond_broadcast):
+	Return immediately after lll_futex_wake.
+
 2014-04-30  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
 	[BZ #16791]
diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c
index ed30e7c60b..7c6c9ea9a2 100644
--- a/nptl/pthread_cond_broadcast.c
+++ b/nptl/pthread_cond_broadcast.c
@@ -81,6 +81,7 @@ __pthread_cond_broadcast (cond)
 
 wake_all:
       lll_futex_wake (&cond->__data.__futex, INT_MAX, pshared);
+      return 0;
     }
 
   /* We are done.  */