Skip to content

Commit f9c9635

Browse files
konisakpm00
authored andcommitted
nilfs2: fix potential oob read in nilfs_btree_check_delete()
The function nilfs_btree_check_delete(), which checks whether degeneration to direct mapping occurs before deleting a b-tree entry, causes memory access outside the block buffer when retrieving the maximum key if the root node has no entries. This does not usually happen because b-tree mappings with 0 child nodes are never created by mkfs.nilfs2 or nilfs2 itself. However, it can happen if the b-tree root node read from a device is configured that way, so fix this potential issue by adding a check for that case. Link: https://lkml.kernel.org/r/[email protected] Fixes: 17c76b0 ("nilfs2: B-tree based block mapping") Signed-off-by: Ryusuke Konishi <[email protected]> Cc: Lizhi Xu <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 111b812 commit f9c9635

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

fs/nilfs2/btree.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,13 +1659,16 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)
16591659
int nchildren, ret;
16601660

16611661
root = nilfs_btree_get_root(btree);
1662+
nchildren = nilfs_btree_node_get_nchildren(root);
1663+
if (unlikely(nchildren == 0))
1664+
return 0;
1665+
16621666
switch (nilfs_btree_height(btree)) {
16631667
case 2:
16641668
bh = NULL;
16651669
node = root;
16661670
break;
16671671
case 3:
1668-
nchildren = nilfs_btree_node_get_nchildren(root);
16691672
if (nchildren > 1)
16701673
return 0;
16711674
ptr = nilfs_btree_node_get_ptr(root, nchildren - 1,
@@ -1674,12 +1677,12 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)
16741677
if (ret < 0)
16751678
return ret;
16761679
node = (struct nilfs_btree_node *)bh->b_data;
1680+
nchildren = nilfs_btree_node_get_nchildren(node);
16771681
break;
16781682
default:
16791683
return 0;
16801684
}
16811685

1682-
nchildren = nilfs_btree_node_get_nchildren(node);
16831686
maxkey = nilfs_btree_node_get_key(node, nchildren - 1);
16841687
nextmaxkey = (nchildren > 1) ?
16851688
nilfs_btree_node_get_key(node, nchildren - 2) : 0;

0 commit comments

Comments
 (0)