diff options
| author | Nickolai Zeldovich <nickolai@csail.mit.edu> | 2026-10-26 21:58:13 -0400 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-10-30 16:03:49 +0100 |
| commit | f3a6dae67c9ca3d913cbb42fe324c9b47c8d9e53 (patch) | |
| tree | 46cb148a601d9a0f26c64790d194137a6b93b8d9 /tools/lib/python/kdoc | |
| parent | 38bf603d1ea5d5a65a9cb277df75327ffec01ff1 (diff) | |
fs_pin: do not trust the pin after a spurious wakeup in pin_kill()
A task waiting in pin_kill() for another task's ->kill() can take
p->wait.lock after the pin has been freed, and can return with its
on-stack wait entry still on p->wait. With BSD process accounting this
is a use-after-free of the acct structure when umount() of the mount
holding the accounting file races with acct(2).
pin_kill() takes a still-queued entry as proof that pin_remove() has not
run, so p is alive. But autoremove_wake_function() dequeues only when
try_to_wake_up() succeeds: if the waiter was already woken spuriously,
pin_remove() leaves the entry queued, acct_pin_kill() frees the acct
with kfree_rcu(), and the grace period can end while the waiter sits
between schedule() and rcu_read_lock().
Dequeue the entry unconditionally in a private wake function;
pin_remove() is the only waker and sets p->done first.
Reproduced under QEMU with KASAN and test-only delays: a
slab-use-after-free in pin_kill() before the patch, no report after.
Fixes: 59eda0e07f43 ("new fs_pin killing logics")
Signed-off-by: Nickolai Zeldovich <nickolai@csail.mit.edu>
Link: https://patch.msgid.link/20261027015813.841821-1-nickolai@csail.mit.edu
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'tools/lib/python/kdoc')
0 files changed, 0 insertions, 0 deletions
