nfs: fix UAF on pathwalk running into umount
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 28 Sep 2023 02:11:26 +0000 (22:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 25 Feb 2024 07:10:32 +0000 (02:10 -0500)
commitc1b967d03c5d570ed7b90a88031fa2af34bf5b20
tree230fde52c95cc00c8d08bdc2a49d119ccd79a325
parent10a973fc4fb22390a8d362dd3265ec2c9a81d84c
nfs: fix UAF on pathwalk running into umount

NFS ->d_revalidate(), ->permission() and ->get_link() need to access
some parts of nfs_server when called in RCU mode:
server->flags
server->caps
*(server->io_stats)
and, worst of all, call
server->nfs_client->rpc_ops->have_delegation
(the last one - as NFS_PROTO(inode)->have_delegation()).  We really
don't want to RCU-delay the entire nfs_free_server() (it would have
to be done with schedule_work() from RCU callback, since it can't
be made to run from interrupt context), but actual freeing of
nfs_server and ->io_stats can be done via call_rcu() just fine.
nfs_client part is handled simply by making nfs_free_client() use
kfree_rcu().

Acked-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/nfs/client.c
include/linux/nfs_fs_sb.h