Fix robust mutex daedlock [BZ #20263]
authorJiyoung Yun <t2wish@gmail.com>
Wed, 29 Jun 2016 16:15:44 +0000 (01:15 +0900)
committerAndreas Schwab <schwab@suse.de>
Thu, 7 Jul 2016 12:33:32 +0000 (14:33 +0200)
In Linux/ARM environment, a robust mutex can't catch the timeout result
when it is already owned by other thread and requests to try lock with
a specific time value(pthread_mutex_timedlock). The futex already returns
the ETIMEDOUT result but there is no check the return value and it makes
a deadlock.

* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.

ChangeLog
nptl/lowlevelrobustlock.c

index 690012c..63dfbc5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-07  Jiyoung Yun  <t2wish@gmail.com>
+
+       [BZ #20263]
+       * nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
+
 2016-07-06  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
        * sysdeps/s390/linkmap.h (struct link_map_machine):
index 3b988b2..efe307e 100644 (file)
@@ -118,8 +118,11 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime,
      || !defined lll_futex_timed_wait_bitset)
       lll_futex_timed_wait (futex, newval, &rt, private);
 #else
-      lll_futex_timed_wait_bitset (futex, newval, abstime,
-                                  FUTEX_CLOCK_REALTIME, private);
+      int err = lll_futex_timed_wait_bitset (futex, newval, abstime,
+                                            FUTEX_CLOCK_REALTIME, private);
+      /* The futex call timed out.  */
+      if (err == -ETIMEDOUT)
+         return -err;
 #endif
 
     try: