mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-24 23:34:00 +00:00
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
1 changed files with 8 additions and 0 deletions
|
@ -1771,6 +1771,14 @@ static noinline int generic_bin_search(struct extent_buffer *eb,
|
||||||
unsigned long map_len = 0;
|
unsigned long map_len = 0;
|
||||||
int err;
|
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) {
|
while (low < high) {
|
||||||
mid = (low + high) / 2;
|
mid = (low + high) / 2;
|
||||||
offset = p + mid * item_size;
|
offset = p + mid * item_size;
|
||||||
|
|
Loading…
Add table
Reference in a new issue