From 2cd183c61616ea2f2834acf4ae0b45ee40c741b7 Mon Sep 17 00:00:00 2001 From: Jiyoung Yun Date: Fri, 24 Jun 2016 02:51:28 +0900 Subject: [PATCH] Fix robust mutex daedlock [BZ #20263] 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. Signed-off-by: Jiyoung Yun --- ChangeLog | 5 +++++ nptl/lowlevelrobustlock.c | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4bfee94..7b95767 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-06-24 Jiyoung Yun + + [BZ #20263] + * nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic. + 2016-06-23 Florian Weimer * test-skeleton.c (xrealloc): Support deallocation with n == 0. diff --git a/nptl/lowlevelrobustlock.c b/nptl/lowlevelrobustlock.c index 3b988b2..8842032 100644 --- a/nptl/lowlevelrobustlock.c +++ b/nptl/lowlevelrobustlock.c @@ -113,15 +113,20 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime, && atomic_compare_and_exchange_bool_acq (futex, newval, oldval)) continue; + int err; /* If *futex == 2, wait until woken or timeout. */ #if (!defined __ASSUME_FUTEX_CLOCK_REALTIME \ || !defined lll_futex_timed_wait_bitset) - lll_futex_timed_wait (futex, newval, &rt, private); + err = lll_futex_timed_wait (futex, newval, &rt, private); #else - lll_futex_timed_wait_bitset (futex, newval, abstime, + err = lll_futex_timed_wait_bitset (futex, newval, abstime, FUTEX_CLOCK_REALTIME, private); #endif + /* the futex call time out */ + if (err == -ETIMEDOUT) + return ETIMEDOUT; + try: ; } -- 1.9.1