В ядре Linux устранена следующая уязвимость:
ext4: исправлена ошибка ядра в ext4_write_inline_data_end
Когда используется опция монтирования data=journal, ext4_journalled_write_end()
функция неправильно вызывает ext4_write_inline_data_end() без проверки
если флаг EXT4_STATE_MAY_INLINE_DATA все еще установлен на индексном дескрипторе. Если предыдущая попытка преобразовать встроенные данные в экстент не удалась (например,
из-за ENOSPC), флаг EXT4_STATE_MAY_INLINE_DATA сбрасывается, но
флаг EXT4_INODE_INLINE_DATA остается установленным. В этом случае следующий
вызов ext4_write_begin() не подготовит встроенные данные xattr для
запись, но ext4_journalled_write_end() неправильно попытается записать
к нему, вызывая BUG_ON(pos + len > EXT4_I(inode)->i_inline_size) в
ext4_write_inline_data(), поскольку i_inline_size не был расширен.
Исправьте это, гарантируя, что ext4_journalled_write_end() вызывает только
ext4_write_inline_data_end(), если флаг EXT4_STATE_MAY_INLINE_DATA установлен.
set, отражая поведение ext4_write_end() и ext4_da_write_end().
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ext4: fix kernel BUG in ext4_write_inline_data_end When the data=journal mount option is used, the ext4_journalled_write_end() function incorrectly calls ext4_write_inline_data_end() without checking if the EXT4_STATE_MAY_INLINE_DATA flag is still set on the inode. If a previous attempt to convert the inline data to an extent failed (e.g. due to ENOSPC), the EXT4_STATE_MAY_INLINE_DATA flag is cleared, but the EXT4_INODE_INLINE_DATA flag remains set. In this scenario, the next call to ext4_write_begin() will not prepare the inline data xattr for writing, but ext4_journalled_write_end() will incorrectly attempt to write to it, triggering a BUG_ON(pos + len > EXT4_I(inode)->i_inline_size) in ext4_write_inline_data() since i_inline_size was not expanded. Fix this by ensuring that ext4_journalled_write_end() only calls ext4_write_inline_data_end() if the EXT4_STATE_MAY_INLINE_DATA flag is set, mirroring the behavior of ext4_write_end() and ext4_da_write_end().