From 04b3bf1779ca97388115ccc5fd8016a2a9f3d12d Mon Sep 17 00:00:00 2001 From: David Sterba Date: Fri, 26 Aug 2016 12:53:31 +0200 Subject: btrfs-progs: dump-tree: improved error handling in print_extents Signed-off-by: David Sterba --- cmds-inspect-dump-tree.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c index 5e206345..cfe7507c 100644 --- a/cmds-inspect-dump-tree.c +++ b/cmds-inspect-dump-tree.c @@ -35,6 +35,7 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) { + struct extent_buffer *next; int i; u32 nr; u32 size; @@ -50,21 +51,32 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) size = root->nodesize; nr = btrfs_header_nritems(eb); for (i = 0; i < nr; i++) { - struct extent_buffer *next = read_tree_block(root, - btrfs_node_blockptr(eb, i), - size, - btrfs_node_ptr_generation(eb, i)); + next = read_tree_block(root, btrfs_node_blockptr(eb, i), + size, btrfs_node_ptr_generation(eb, i)); if (!extent_buffer_uptodate(next)) continue; - if (btrfs_is_leaf(next) && - btrfs_header_level(eb) != 1) - BUG(); - if (btrfs_header_level(next) != - btrfs_header_level(eb) - 1) - BUG(); + if (btrfs_is_leaf(next) && btrfs_header_level(eb) != 1) { + warning( + "eb corrupted: item %d eb level %d next level %d, skipping the rest", + i, btrfs_header_level(next), + btrfs_header_level(eb)); + goto out; + } + if (btrfs_header_level(next) != btrfs_header_level(eb) - 1) { + warning( + "eb corrupted: item %d eb level %d next level %d, skipping the rest", + i, btrfs_header_level(next), + btrfs_header_level(eb)); + goto out; + } print_extents(root, next); free_extent_buffer(next); } + + return; + +out: + free_extent_buffer(next); } static void print_old_roots(struct btrfs_super_block *super) -- cgit v1.2.3