Skip to content

Commit f368b81

Browse files
committed
btrfs: tree-checker: ensure free space tree entries won't overflow
Add an extra check to ensure the free space extent/bitmap and space info keys won't overflow. Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com>
1 parent e096696 commit f368b81

1 file changed

Lines changed: 14 additions & 0 deletions

File tree

fs/btrfs/tree-checker.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,6 +2102,7 @@ static int check_free_space_info(struct extent_buffer *leaf, struct btrfs_key *k
21022102
struct btrfs_fs_info *fs_info = leaf->fs_info;
21032103
struct btrfs_free_space_info *fsi;
21042104
const u32 blocksize = fs_info->sectorsize;
2105+
u64 end;
21052106
u32 flags;
21062107

21072108
if (unlikely(!IS_ALIGNED(key->objectid, blocksize))) {
@@ -2116,6 +2117,12 @@ static int check_free_space_info(struct extent_buffer *leaf, struct btrfs_key *k
21162117
blocksize, BTRFS_KEY_FMT_VALUE(key));
21172118
return -EUCLEAN;
21182119
}
2120+
if (unlikely(check_add_overflow(key->objectid, key->offset, &end))) {
2121+
generic_err(leaf, slot,
2122+
"free space info key overflows, has " BTRFS_KEY_FMT,
2123+
BTRFS_KEY_FMT_VALUE(key));
2124+
return -EUCLEAN;
2125+
}
21192126
if (unlikely(btrfs_item_size(leaf, slot) !=
21202127
sizeof(struct btrfs_free_space_info))) {
21212128
generic_err(leaf, slot,
@@ -2148,6 +2155,7 @@ static int check_free_space_common_key(struct extent_buffer *leaf, struct btrfs_
21482155
struct btrfs_fs_info *fs_info = leaf->fs_info;
21492156
const u32 blocksize = fs_info->sectorsize;
21502157
const char *type_str = (key->type == BTRFS_FREE_SPACE_EXTENT_KEY) ? "extent" : "bitmap";
2158+
u64 end;
21512159

21522160
if (unlikely(!IS_ALIGNED(key->objectid, blocksize))) {
21532161
generic_err(leaf, slot,
@@ -2165,6 +2173,12 @@ static int check_free_space_common_key(struct extent_buffer *leaf, struct btrfs_
21652173
generic_err(leaf, slot, "free space %s length is 0", type_str);
21662174
return -EUCLEAN;
21672175
}
2176+
if (unlikely(check_add_overflow(key->objectid, key->offset, &end))) {
2177+
generic_err(leaf, slot,
2178+
"free space %s end overflow, have objectid %llu offset %llu",
2179+
type_str, key->objectid, key->offset);
2180+
return -EUCLEAN;
2181+
}
21682182
return 0;
21692183
}
21702184

0 commit comments

Comments
 (0)