Skip to content

Commit 0eab1c5

Browse files
RichardWeiYangSasha Levin
authored andcommitted
maple_tree: refine mas_store_root() on storing NULL
commit 0ea120b upstream. Currently, when storing NULL on mas_store_root(), the behavior could be improved. Storing NULLs over the entire tree may result in a node being used to store a single range. Further stores of NULL may cause the node and tree to be corrupt and cause incorrect behaviour. Fixing the store to the root null fixes the issue by ensuring that a range of 0 - ULONG_MAX results in an empty tree. Users of the tree may experience incorrect values returned if the tree was expanded to store values, then overwritten by all NULLS, then continued to store NULLs over the empty area. For example possible cases are: * store NULL at any range result a new node * store NULL at range [m, n] where m > 0 to a single entry tree result a new node with range [m, n] set to NULL * store NULL at range [m, n] where m > 0 to an empty tree result consecutive NULL slot * it allows for multiple NULL entries by expanding root to store NULLs to an empty tree This patch tries to improve in: * memory efficient by setting to empty tree instead of using a node * remove the possibility of consecutive NULL slot which will prohibit extended null in later operation Link: https://lkml.kernel.org/r/[email protected] Fixes: 54a611b ("Maple Tree: add new data structure") Signed-off-by: Wei Yang <[email protected]> Reviewed-by: Liam R. Howlett <[email protected]> Cc: Liam R. Howlett <[email protected]> Cc: Sidhartha Kumar <[email protected]> Cc: Lorenzo Stoakes <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 5ba2ead commit 0eab1c5

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

lib/maple_tree.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3723,9 +3723,20 @@ static inline int mas_root_expand(struct ma_state *mas, void *entry)
37233723
return slot;
37243724
}
37253725

3726+
/*
3727+
* mas_store_root() - Storing value into root.
3728+
* @mas: The maple state
3729+
* @entry: The entry to store.
3730+
*
3731+
* There is no root node now and we are storing a value into the root - this
3732+
* function either assigns the pointer or expands into a node.
3733+
*/
37263734
static inline void mas_store_root(struct ma_state *mas, void *entry)
37273735
{
3728-
if (likely((mas->last != 0) || (mas->index != 0)))
3736+
if (!entry) {
3737+
if (!mas->index)
3738+
rcu_assign_pointer(mas->tree->ma_root, NULL);
3739+
} else if (likely((mas->last != 0) || (mas->index != 0)))
37293740
mas_root_expand(mas, entry);
37303741
else if (((unsigned long) (entry) & 3) == 2)
37313742
mas_root_expand(mas, entry);

0 commit comments

Comments
 (0)