From f4fe930941ad7e73ca2064c8be1abc31626ec50b Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 6 Jul 2015 15:01:22 -0400 Subject: [PATCH] Fix: compat_futex.c: *uaddr should be read as volatile Ensure that a volatile read is used when reading *uaddr in the compatibility implementation for sys_futex FUTEX_WAIT. Signed-off-by: Mathieu Desnoyers --- compat_futex.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compat_futex.c b/compat_futex.c index 9a08624..6ec0b39 100644 --- a/compat_futex.c +++ b/compat_futex.c @@ -30,6 +30,7 @@ #include #include +#include /* * Using attribute "weak" for __urcu_compat_futex_lock and @@ -77,7 +78,7 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val, * Comparing *uaddr content against val figures out which * thread has been awakened. */ - while (*uaddr == val) + while (CMM_LOAD_SHARED(*uaddr) == val) pthread_cond_wait(&__urcu_compat_futex_cond, &__urcu_compat_futex_lock); break; @@ -121,7 +122,7 @@ int compat_futex_async(int32_t *uaddr, int op, int32_t val, switch (op) { case FUTEX_WAIT: - while (*uaddr == val) + while (CMM_LOAD_SHARED(*uaddr) == val) poll(NULL, 0, 10); break; case FUTEX_WAKE: -- 2.34.1