David Howells 9a6b294ab4 afs: Fix use-after-free due to get/remove race in volume tree
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: 20325960f875 ("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>
2023-12-21 10:16:07 -08:00
..
2023-11-04 09:20:04 -10:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-12-17 09:27:36 -08:00
2023-11-10 09:52:56 -08:00
2023-10-30 09:47:13 -10:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-03 22:24:11 +09:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-07 11:54:17 -08:00
2023-10-30 09:47:13 -10:00
2023-10-30 09:47:13 -10:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-03 15:15:47 -10:00
2023-11-08 13:39:16 -08:00
2023-12-20 11:16:50 -08:00
2023-08-31 12:07:34 -05:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-11-07 12:11:26 -08:00
2023-10-30 09:47:13 -10:00
2023-12-20 12:04:03 -08:00
2023-10-30 19:26:39 -10:00
2023-10-30 09:47:13 -10:00
\n
2023-11-02 08:19:51 -10:00
2023-12-13 11:14:09 -05:00
2023-11-25 08:57:09 -08:00
2023-10-30 19:28:19 -10:00
2023-10-30 19:28:19 -10:00
2023-06-26 09:50:21 -07:00
2023-05-17 09:16:59 +02:00
2023-08-21 13:46:25 -07:00
2023-10-30 09:14:19 -10:00
2023-10-19 11:02:47 +02:00
2023-08-28 11:04:18 -07:00
2023-08-19 12:12:12 +02:00
2023-10-22 17:08:07 -04:00
2023-10-30 09:14:19 -10:00
2023-05-19 04:30:22 +02:00
2023-05-19 04:30:22 +02:00
2023-08-15 08:32:45 +02:00
2023-11-07 11:46:31 -08:00
2023-02-20 11:53:11 -08:00