mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-04 11:51:42 +00:00
btrfs-progs: check: Fix wrong level access
There's no reason to assume that the bad key order is in a leaf block, so accessing level 0 of the path is going to be an error if it's actually a node block that's bad. Reported-by: Chris Mason <clm@fb.com> Signed-off-by: Hugo Mills <hugo@carfax.org.uk> Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
parent
8efdd3ca4c
commit
b5fc0b9014
10
cmds-check.c
10
cmds-check.c
@ -2418,6 +2418,7 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans,
|
|||||||
struct btrfs_path *path;
|
struct btrfs_path *path;
|
||||||
struct btrfs_key k1, k2;
|
struct btrfs_key k1, k2;
|
||||||
int i;
|
int i;
|
||||||
|
int level;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (status != BTRFS_TREE_BLOCK_BAD_KEY_ORDER)
|
if (status != BTRFS_TREE_BLOCK_BAD_KEY_ORDER)
|
||||||
@ -2435,9 +2436,10 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans,
|
|||||||
if (!path)
|
if (!path)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
path->lowest_level = btrfs_header_level(buf);
|
level = btrfs_header_level(buf);
|
||||||
|
path->lowest_level = level;
|
||||||
path->skip_check_block = 1;
|
path->skip_check_block = 1;
|
||||||
if (btrfs_header_level(buf))
|
if (level)
|
||||||
btrfs_node_key_to_cpu(buf, &k1, 0);
|
btrfs_node_key_to_cpu(buf, &k1, 0);
|
||||||
else
|
else
|
||||||
btrfs_item_key_to_cpu(buf, &k1, 0);
|
btrfs_item_key_to_cpu(buf, &k1, 0);
|
||||||
@ -2448,9 +2450,9 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans,
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = path->nodes[0];
|
buf = path->nodes[level];
|
||||||
for (i = 0; i < btrfs_header_nritems(buf) - 1; i++) {
|
for (i = 0; i < btrfs_header_nritems(buf) - 1; i++) {
|
||||||
if (btrfs_header_level(buf)) {
|
if (level) {
|
||||||
btrfs_node_key_to_cpu(buf, &k1, i);
|
btrfs_node_key_to_cpu(buf, &k1, i);
|
||||||
btrfs_node_key_to_cpu(buf, &k2, i + 1);
|
btrfs_node_key_to_cpu(buf, &k2, i + 1);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user