Fix: compat_futex.c: *uaddr should be read as volatile
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 6 Jul 2015 19:01:22 +0000 (15:01 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 6 Jul 2015 19:29:59 +0000 (15:29 -0400)
Ensure that a volatile read is used when reading *uaddr in the
compatibility implementation for sys_futex FUTEX_WAIT.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
compat_futex.c

index 9a08624bbab59be80c9472331f7b8e4ef0f5d54c..6ec0b3912b34afbda58c873371f83aec55d35f68 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <urcu/arch.h>
 #include <urcu/futex.h>
+#include <urcu/system.h>
 
 /*
  * 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:
This page took 0.034055 seconds and 4 git commands to generate.