Theodore Ts'o wrote: > Instead of just checking that the extent block number is greater or > equal than s_first_data_block, make sure it it is not pointing into > the block group descriptors, since that is clearly wrong. This helps > prevent filesystem from getting very badly corrupted in case an extent > block is corrupted. > > Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx> Good idea. Maybe we can get our friends with the corrupted fs to run with these validation patches... I can get this into rawhide at least. Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > fs/ext4/extents.c | 18 ++++++++++++------ > 1 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index 6132353..c28ffe2 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -326,11 +326,14 @@ ext4_ext_max_entries(struct inode *inode, int depth) > > static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) > { > - ext4_fsblk_t block = ext_pblock(ext); > + ext4_fsblk_t block = ext_pblock(ext), valid_block; > int len = ext4_ext_get_actual_len(ext); > struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; > - if (unlikely(block < le32_to_cpu(es->s_first_data_block) || > - ((block + len) > ext4_blocks_count(es)))) > + > + valid_block = le32_to_cpu(es->s_first_data_block) + > + EXT4_SB(inode->i_sb)->s_gdb_count; > + if (unlikely(block <= valid_block || > + ((block + len) > ext4_blocks_count(es)))) > return 0; > else > return 1; > @@ -339,10 +342,13 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) > static int ext4_valid_extent_idx(struct inode *inode, > struct ext4_extent_idx *ext_idx) > { > - ext4_fsblk_t block = idx_pblock(ext_idx); > + ext4_fsblk_t block = idx_pblock(ext_idx), valid_block; > struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; > - if (unlikely(block < le32_to_cpu(es->s_first_data_block) || > - (block >= ext4_blocks_count(es)))) > + > + valid_block = le32_to_cpu(es->s_first_data_block) + > + EXT4_SB(inode->i_sb)->s_gdb_count; > + if (unlikely(block <= valid_block || > + (block >= ext4_blocks_count(es)))) > return 0; > else > return 1; -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html