| Date | Thu, 05 Aug 2021 17:13:54 +0200 | From | Thomas Gleixner <> | Subject | [patch V3 54/64] futex: Validate waiter correctly in futex_proxy_trylock_atomic() |
| |
From: Thomas Gleixner <tglx@linutronix.de>
The loop in futex_requeue() has a sanity check for the waiter which is missing in futex_proxy_trylock_atomic(). In theory the key2 check is sufficient, but futexes are cursed so add it for completeness and paranoia sake.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- kernel/futex.c | 7 +++++++ 1 file changed, 7 insertions(+) --- --- a/kernel/futex.c +++ b/kernel/futex.c @@ -1879,6 +1879,13 @@ futex_proxy_trylock_atomic(u32 __user *p if (!top_waiter) return 0; + /* + * Ensure that this is a waiter sitting in futex_wait_requeue_pi() + * and waiting on the 'waitqueue' futex which is always !PI. + */ + if (!top_waiter->rt_waiter || top_waiter->pi_state) + ret = -EINVAL; + /* Ensure we requeue to the expected futex. */ if (!match_futex(top_waiter->requeue_pi_key, key2)) return -EINVAL;
|