diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2021-08-15 23:29:04 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2021-08-17 19:05:36 +0200 |
commit | dc7109aaa233d83b573f75763a9f1ae207042a53 (patch) | |
tree | 840d93235712730caeffb9567603895b62cac6f7 /kernel/futex.c | |
parent | c49f7ece4617807c5de06857d196c825aadf60d5 (diff) | |
download | lwn-dc7109aaa233d83b573f75763a9f1ae207042a53.tar.gz lwn-dc7109aaa233d83b573f75763a9f1ae207042a53.zip |
futex: Validate waiter correctly in futex_proxy_trylock_atomic()
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>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210815211305.193767519@linutronix.de
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index 21625cb3e865..a1f27fd55a23 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -1879,6 +1879,13 @@ futex_proxy_trylock_atomic(u32 __user *pifutex, struct futex_hash_bucket *hb1, 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; |