Fix: compat_futex_noasync race condition
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 17 Mar 2015 21:53:21 +0000 (17:53 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 17 Mar 2015 22:01:04 +0000 (18:01 -0400)
commit1f80e0f9f697b6a1d77cf493900013d0d0684b86
tree9a5f8a085c303fd650c12864832dacb7e78a7a6c
parent6278a922c993b7e2a2ed4e0e3e75fb642271f3ba
Fix: compat_futex_noasync race condition

The Userspace RCU compatibility layer around sys_futex has a race
condition which makes pretty much all "benchmark" tests hang pretty
quickly on non-Linux systems (tested on Mac OS X).

I narrowed it down to a bug in compat_futex_noasync: this compat layer
uses a single pthread mutex and condition variable for all callers,
independently of their uaddr. The FUTEX_WAKE performs a pthread cond
broadcast to all waiters. FUTEX_WAIT must then compare *uaddr with val
to see which thread has been awakened.

Unfortunately, the check was not done again after each return from
pthread_cond_wait(), thus causing the race.

This race affects threads using the futex_noasync() compatibility layer
concurrently, thus it affects only on non-Linux systems.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
compat_futex.c
This page took 0.033233 seconds and 4 git commands to generate.