Btrfs: error out if generic_bin_search get invalid arguments
With btrfs-corrupt-block, one can set btree node/leaf's field, if we assign a negative value to node/leaf, we can get various hangs, eg. if extent_root's nritems is -2ULL, then we get stuck in btrfs_read_block_groups() because it has a while loop and btrfs_search_slot() on extent_root will always return the first child. This lets us know what's happening and returns a EINVAL to callers instead of returning the first item. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
6fb37b756a
commit
5e24e9af01
|
@ -1771,6 +1771,14 @@ static noinline int generic_bin_search(struct extent_buffer *eb,
|
|||
unsigned long map_len = 0;
|
||||
int err;
|
||||
|
||||
if (low > high) {
|
||||
btrfs_err(eb->fs_info,
|
||||
"%s: low (%d) > high (%d) eb %llu owner %llu level %d",
|
||||
__func__, low, high, eb->start,
|
||||
btrfs_header_owner(eb), btrfs_header_level(eb));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
while (low < high) {
|
||||
mid = (low + high) / 2;
|
||||
offset = p + mid * item_size;
|
||||
|
|
Loading…
Reference in New Issue