[lvc-project] [PATCH 1/3] ext2: reject out-of-range block_group in ext2_free_blocks()

Fedor Pchelkin pchelkin at ispras.ru
Tue May 12 16:51:37 MSK 2026


On Tue, 12. May 15:22, Denis Zubov wrote:
> On a corrupt ext2 image, ext2_free_blocks() can compute block_group
> beyond sbi->s_groups_count from an on-disk block pointer recovered
> during inode eviction. ext2_get_group_desc() then issues a WARN; with
> panic_on_warn set this panics the kernel:

Что означает 'recovered during inode eviction'?

> @@ -509,6 +509,14 @@ void ext2_free_blocks(struct inode * inode, ext2_fsblk_t block,
>  		      EXT2_BLOCKS_PER_GROUP(sb);
>  	bit = (block - le32_to_cpu(es->s_first_data_block)) %
>  		      EXT2_BLOCKS_PER_GROUP(sb);
> +
> +	if (block_group >= sbi->s_groups_count) {
> +		ext2_error(sb, "ext2_free_blocks",
> +					"Freeing blocks in non-existent group %lu (groups_count = %lu): block = %llu, count = %lu",
> +					block_group, sbi->s_groups_count,
> +					(unsigned long long)block, count);
> +		goto error_return;
> +	}

При монтировании в ext2_fill_super() проверяется следующее:

	sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
				le32_to_cpu(es->s_first_data_block) - 1)
					/ EXT2_BLOCKS_PER_GROUP(sb)) + 1;
	if ((u64)sbi->s_groups_count * sbi->s_inodes_per_group !=
	    le32_to_cpu(es->s_inodes_count)) {
		ext2_msg(sb, KERN_ERR, "error: invalid #inodes: %u vs computed %llu",
			 le32_to_cpu(es->s_inodes_count),
			 (u64)sbi->s_groups_count * sbi->s_inodes_per_group);
		goto failed_mount;
	}

этой проверки не должно быть достаточно?

Какие данные при вычислении

	block_group = (block - le32_to_cpu(es->s_first_data_block)) /
		      EXT2_BLOCKS_PER_GROUP(sb);

мусорные приходят?

Если проблема - это https://gitlab.linuxtesting.ru/lvc/kernel-issues/-/issues/346,
то там есть основания полагать, что фаззер портит нижележащее блочное loop
устройство, на котором смонтирована ФС.  Против подобного рода ошибок
особо ничего не поделать кроме переноса в стабильные ветки апстримной
серии патчей
https://lore.kernel.org/all/20231101173542.23597-1-jack@suse.cz/
которая вводит конфиг. опцию ядра CONFIG_BLK_DEV_WRITE_MOUNTED,
позволяющую запрещать запись в смонтированные блочные устройства и которую
полезно отключать при фаззинге.



More information about the lvc-project mailing list