From: Kent Overstreet Date: Sun, 11 Aug 2024 01:04:35 +0000 (-0400) Subject: lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=b2f11c6f3e1fc60742673b8675c95b78447f3dae;p=users%2Fdwmw2%2Flinux.git lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc() If we need to increase the tree depth, allocate a new node, and then race with another thread that increased the tree depth before us, we'll still have a preallocated node that might be used later. If we then use that node for a new non-root node, it'll still have a pointer to the old root instead of being zeroed - fix this by zeroing it in the cmpxchg failure path. Signed-off-by: Kent Overstreet --- diff --git a/lib/generic-radix-tree.c b/lib/generic-radix-tree.c index aaefb9b678c8e..fa692c86f0696 100644 --- a/lib/generic-radix-tree.c +++ b/lib/generic-radix-tree.c @@ -121,6 +121,8 @@ void *__genradix_ptr_alloc(struct __genradix *radix, size_t offset, if ((v = cmpxchg_release(&radix->root, r, new_root)) == r) { v = new_root; new_node = NULL; + } else { + new_node->children[0] = NULL; } }