WSL2-Linux-Kernel/fs/afs
David Howells 98fb5eaade afs: Fix use-after-free due to get/remove race in volume tree
[ Upstream commit 9a6b294ab496650e9f270123730df37030911b55 ]

When an afs_volume struct is put, its refcount is reduced to 0 before
the cell->volume_lock is taken and the volume removed from the
cell->volumes tree.

Unfortunately, this means that the lookup code can race and see a volume
with a zero ref in the tree, resulting in a use-after-free:

    refcount_t: addition on 0; use-after-free.
    WARNING: CPU: 3 PID: 130782 at lib/refcount.c:25 refcount_warn_saturate+0x7a/0xda
    ...
    RIP: 0010:refcount_warn_saturate+0x7a/0xda
    ...
    Call Trace:
     afs_get_volume+0x3d/0x55
     afs_create_volume+0x126/0x1de
     afs_validate_fc+0xfe/0x130
     afs_get_tree+0x20/0x2e5
     vfs_get_tree+0x1d/0xc9
     do_new_mount+0x13b/0x22e
     do_mount+0x5d/0x8a
     __do_sys_mount+0x100/0x12a
     do_syscall_64+0x3a/0x94
     entry_SYSCALL_64_after_hwframe+0x62/0x6a

Fix this by:

 (1) When putting, use a flag to indicate if the volume has been removed
     from the tree and skip the rb_erase if it has.

 (2) When looking up, use a conditional ref increment and if it fails
     because the refcount is 0, replace the node in the tree and set the
     removal flag.

Fixes: 20325960f8 ("afs: Reorganise volume and server trees to be rooted on the cell")
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jeffrey Altman <jaltman@auristor.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-01-05 15:13:30 +01:00
..
Kconfig afs: Use new netfs lib read helper API 2021-04-23 10:17:28 +01:00
Makefile afs: Detect cell aliases 1 - Cells with root volumes 2020-06-04 15:37:57 +01:00
addr_list.c
afs.h afs: Implement client support for the YFSVL.GetCellName RPC op 2020-06-04 15:37:57 +01:00
afs_cm.h
afs_fs.h
afs_vl.h afs: Implement client support for the YFSVL.GetCellName RPC op 2020-06-04 15:37:57 +01:00
cache.c
callback.c afs: Try to avoid taking RCU read lock when checking vnode validity 2021-09-13 09:10:39 +01:00
cell.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
cmservice.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
dir.c afs: Fix setting of mtime when creating a file/dir/symlink 2023-06-14 11:13:00 +02:00
dir_edit.c afs: Fix updating of i_blocks on file/dir extension 2021-09-13 09:14:21 +01:00
dir_silly.c afs: Fix kerneldoc warning shown up by W=1 2021-10-04 22:04:44 +01:00
dynroot.c afs: Fix dynamic root lookup DNS check 2024-01-05 15:13:30 +01:00
file.c afs: Fix mmap 2021-12-22 09:32:45 +01:00
flock.c afs: Use the operation issue time instead of the reply time for callbacks 2022-09-15 11:30:05 +02:00
fs_operation.c afs: Fix speculative status fetches 2021-05-01 11:55:36 -07:00
fs_probe.c afs: Fix lost servers_outstanding count 2022-12-31 13:14:45 +01:00
fsclient.c afs: Use the operation issue time instead of the reply time for callbacks 2022-09-15 11:30:05 +02:00
inode.c afs: Fix updating of i_size with dv jump from server 2023-05-11 23:00:38 +09:00
internal.h afs: Fix use-after-free due to get/remove race in volume tree 2024-01-05 15:13:30 +01:00
main.c afs: Fix an IS_ERR() vs NULL check 2021-06-15 07:42:26 -07:00
misc.c afs: Return -EAGAIN, not -EREMOTEIO, when a file already locked 2022-09-23 14:15:51 +02:00
mntpt.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-15 17:09:54 +00:00
proc.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
protocol_afs.h afs: Fix corruption in reads at fpos 2G-4G from an OpenAFS server 2021-09-13 09:14:21 +01:00
protocol_uae.h
protocol_yfs.h afs: Fix corruption in reads at fpos 2G-4G from an OpenAFS server 2021-09-13 09:14:21 +01:00
rotate.c afs: Adjust ACK interpretation to try and cope with NAT 2022-06-09 10:22:40 +02:00
rxrpc.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
security.c fs: make helpers idmap mount aware 2021-01-24 14:27:20 +01:00
server.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
server_list.c afs: Fix afs_server_list to be cleaned up with RCU 2023-12-03 07:31:21 +01:00
super.c afs: Fix file locking on R/O volumes to operate in local mode 2023-12-03 07:31:22 +01:00
vl_alias.c afs: Add tracing for cell refcount and active user count 2020-10-16 14:39:21 +01:00
vl_list.c afs: Use refcount_t rather than atomic_t 2024-01-05 15:13:30 +01:00
vl_probe.c afs: Fix vlserver probe RTT handling 2023-06-21 15:59:18 +02:00
vl_rotate.c afs: Return ENOENT if no cell DNS record can be found 2023-12-03 07:31:22 +01:00
vlclient.c afs: Fix fall-through warnings for Clang 2021-05-25 07:30:34 -10:00
volume.c afs: Fix use-after-free due to get/remove race in volume tree 2024-01-05 15:13:30 +01:00
write.c afs: Adjust ACK interpretation to try and cope with NAT 2022-06-09 10:22:40 +02:00
xattr.c afs: Stop listxattr() from listing "afs.*" attributes 2021-03-15 17:09:54 +00:00
xdr_fs.h afs: Fix directory entry size calculation 2021-01-04 12:25:19 +00:00
yfsclient.c afs: Use the operation issue time instead of the reply time for callbacks 2022-09-15 11:30:05 +02:00