[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