diff options
author | Matthew Wilcox <willy@infradead.org> | 2018-12-06 08:19:13 -0500 |
---|---|---|
committer | Matthew Wilcox <willy@infradead.org> | 2018-12-06 08:26:16 -0500 |
commit | eff3860bbfedbac6edac57fb0d7f3a60e860c1c3 (patch) | |
tree | 99b3f3e6321a16cfba84319c4a94a1aa653e68d9 /lib | |
parent | cf76c364a1e1e5224af80edf70a1e3023e1fcf8c (diff) | |
download | lwn-eff3860bbfedbac6edac57fb0d7f3a60e860c1c3.tar.gz lwn-eff3860bbfedbac6edac57fb0d7f3a60e860c1c3.zip |
radix tree: Don't return retry entries from lookup
Commit 66ee620f06f9 ("idr: Permit any valid kernel pointer to be stored")
changed the radix tree lookup so that it stops when reaching the bottom
of the tree. However, the condition was added in the wrong place,
making it possible to return retry entries to the caller. Reorder the
tests to check for the retry entry before checking whether we're at the
bottom of the tree. The retry entry should never be found in the tree
root, so it's safe to defer the check until the end of the loop.
Add a regression test to the test-suite to be sure this doesn't come
back.
Fixes: 66ee620f06f9 ("idr: Permit any valid kernel pointer to be stored")
Reported-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/radix-tree.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 1106bb6aa01e..14d51548bea6 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c @@ -784,11 +784,11 @@ void *__radix_tree_lookup(const struct radix_tree_root *root, while (radix_tree_is_internal_node(node)) { unsigned offset; - if (node == RADIX_TREE_RETRY) - goto restart; parent = entry_to_node(node); offset = radix_tree_descend(parent, &node, index); slot = parent->slots + offset; + if (node == RADIX_TREE_RETRY) + goto restart; if (parent->shift == 0) break; } |