When FUTEX_CMP_REQUEUE_PI requeues a non-top waiter that already owns the
target PI futex, task_blocks_on_rt_mutex() returns -EDEADLK before setting
waiter->task.
The subsequent remove_waiter() in rt_mutex_start_proxy_lock() dereferences
the NULL waiter->task, causing a kernel crash.
Add a self-deadlock check for non-top waiters before calling
rt_mutex_start_proxy_lock(), analogous to the top-waiter check in
futex_lock_pi_atomic().
Fixes:
|
||
|---|---|---|
| .. | ||
| core.c | ||
| futex.h | ||
| Makefile | ||
| pi.c | ||
| requeue.c | ||
| syscalls.c | ||
| waitwake.c | ||