summaryrefslogtreecommitdiff
path: root/include/linux/generic-radix-tree.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-02-12 20:12:43 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2021-02-12 21:42:46 -0500
commitc28f93bc52c5a9ffe89a43c2db562b2b371648e3 (patch)
tree5b1a7d9f67bfc4cf81f6395e17aa3b4f4c361abe /include/linux/generic-radix-tree.h
parent868abec1ab5068dcab59fb8d7ad5e11b7bba89f3 (diff)
generix radix trees: Don't overflow in peek()
Diffstat (limited to 'include/linux/generic-radix-tree.h')
-rw-r--r--include/linux/generic-radix-tree.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/generic-radix-tree.h b/include/linux/generic-radix-tree.h
index 3a91130a..f09689da 100644
--- a/include/linux/generic-radix-tree.h
+++ b/include/linux/generic-radix-tree.h
@@ -183,6 +183,14 @@ void *__genradix_iter_peek(struct genradix_iter *, struct __genradix *, size_t);
static inline void __genradix_iter_advance(struct genradix_iter *iter,
size_t obj_size)
{
+ size_t new_offset = iter->offset + obj_size;
+
+ if (new_offset < iter->offset) {
+ iter->offset = SIZE_MAX;
+ iter->pos = SIZE_MAX;
+ return;
+ }
+
iter->offset += obj_size;
if (!is_power_of_2(obj_size) &&