Re: [PATCH 3/4] ocfs2: validate extent block list fields during block read

Heming Zhao <[email protected]>
Newsgroups dev.linux.lists.ocfs2-devel,org.kernel.vger.linux-kernel
Message-ID <nv7f5mikcxti4p2lsgfjfmzebwponpsmfuwfjc42taxvzcxwgt@or6nssmvmstv>
On Fri, Apr 03, 2026 at 05:08:02PM +0800, Joseph Qi wrote:
> Add extent list validation to ocfs2_validate_extent_block() so that
> corrupted on-disk fields are caught early at block read time rather
> than during extent tree traversal.
> 
> Two checks are added:
> 
>   - l_count must equal the expected value from
>     ocfs2_extent_recs_per_eb(), catching blocks with a corrupted record
>     count before any array iteration.
> 
>   - l_next_free_rec must not exceed l_count, preventing out-of-bounds
>     access when iterating over extent records.
> 
> Signed-off-by: Joseph Qi <[email protected]>

LGTM
Reviewed-by: Heming Zhao <[email protected]>
> ---
>  fs/ocfs2/alloc.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
> index 344fd4d95fbc..8639806bcbb8 100644
> --- a/fs/ocfs2/alloc.c
> +++ b/fs/ocfs2/alloc.c
> @@ -917,11 +917,32 @@ static int ocfs2_validate_extent_block(struct super_block *sb,
>  		goto bail;
>  	}
>  
> -	if (le32_to_cpu(eb->h_fs_generation) != OCFS2_SB(sb)->fs_generation)
> +	if (le32_to_cpu(eb->h_fs_generation) != OCFS2_SB(sb)->fs_generation) {
>  		rc = ocfs2_error(sb,
>  				 "Extent block #%llu has an invalid h_fs_generation of #%u\n",
>  				 (unsigned long long)bh->b_blocknr,
>  				 le32_to_cpu(eb->h_fs_generation));
> +		goto bail;
> +	}
> +
> +	if (le16_to_cpu(eb->h_list.l_count) != ocfs2_extent_recs_per_eb(sb)) {
> +		rc = ocfs2_error(sb,
> +				 "Extent block #%llu has invalid l_count %u (expected %u)\n",
> +				 (unsigned long long)bh->b_blocknr,
> +				 le16_to_cpu(eb->h_list.l_count),
> +				 ocfs2_extent_recs_per_eb(sb));
> +		goto bail;
> +	}
> +
> +	if (le16_to_cpu(eb->h_list.l_next_free_rec) > le16_to_cpu(eb->h_list.l_count)) {
> +		rc = ocfs2_error(sb,
> +				 "Extent block #%llu has invalid l_next_free_rec %u (l_count %u)\n",
> +				 (unsigned long long)bh->b_blocknr,
> +				 le16_to_cpu(eb->h_list.l_next_free_rec),
> +				 le16_to_cpu(eb->h_list.l_count));
> +		goto bail;
> +	}
> +
>  bail:
>  	return rc;
>  }
> -- 
> 2.39.3
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.