bug in radix_tree_delete
Subsystems (2)
PATCH 1/1 bug in radix_tree_delete
I was looking through the radix tree code and came across what I think is a bug in radix_tree_delete.
for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
if (pathp[0].node->tags[tag][idx]) {
tags[tag] = 1;
nr_cleared_tags--;
break;
}
}The above loop should only be executed if tags[tag] is zero. Otherwise, when walking up the tree, we can decrement nr_cleared_tags twice or more for the same value of tag, thus potentially exiting the outer loop too early.
radix-tree: Ensure that nr_cleared_tags is only decremented once for each tag.
Signed-off-by Dave Kleikamp <[email protected]>
lib/radix-tree.c +4 -2
@@ -725,8 +725,10 @@ void *radix_tree_delete(struct radix_trefor (tag =0 ; tag <RADIX_TREE_TAGS ; tag++) {int idx; -if (!tags[tag]) -tag_clear (pathp[0 ].node, tag, pathp[0 ].offset); +if (tags[tag]) +continue ; + +tag_clear (pathp[0 ].node, tag, pathp[0 ].offset);for (idx =0 ; idx <RADIX_TREE_TAG_LONGS ; idx++) {if (pathp[0 ].node->tags[tag][idx]) {
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>