[lvc-project] [PATCH] f2fs: Add a flush_work() call before destroying raw_super
Fedor Pchelkin
pchelkin at ispras.ru
Thu Apr 30 00:38:59 MSK 2026
On Wed, 29. Apr 13:32, Andrey Tsygunka wrote:
> KASAN reports a use-after-free in f2fs_record_stop_reason(), called
> from f2fs_record_error_work() during the execution of s_error_work.
>
> The error occurs when attempting to access sbi->raw_super after it
> was freed in f2fs_fill_super().
>
> The reason for this error is that some superblock initialization error
> handling in f2fs_fill_super() frees raw_super while s_error_work has
> not yet completed execution, leading to a race condition
> and use-after-free.
Добрый вечер. Спасибо за патч.
В описании выше стоит подуточнить, что именно за ошибку инициализации
схватил репродьюсер. На пути обработки ошибки в f2fs_fill_super() есть
flush этой работы, но по-видимому он не вызывается (?).
[...]
Приветствуется "Found by Linux Verification Center ..."
>
> Fixes: b62e71be2110 ("f2fs: support errors=remount-ro|continue|panic mountoption")
> Signed-off-by: Andrey Tsygunka <aitsygunka at yandex.ru>
> ---
> fs/f2fs/super.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index ccf806b676f5..e9fe57e4aef2 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -5449,6 +5449,8 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
> /* no need to free dummy_enc_policy, we just keep it in ctx when failed */
> swap(F2FS_CTX_INFO(ctx).dummy_enc_policy, F2FS_OPTION(sbi).dummy_enc_policy);
> free_sb_buf:
> + /* flush s_error_work before raw_super destroy */
Комментарий в такой форме излишен, т.к. дублирует, что делает код. Если
хочется добавить комментарий, можно написать, _почему_ здесь требуется
*дополнительный* flush.
А в целом почему имеющийся flush_work() не передвинуть на эту позицию,
чтобы он соотносился с INIT_WORK() выше? После INIT_WORK какая-либо
ошибка в какой-нибудь из функций инициализации может поставить
s_error_work в очередь на выполнение, и без flush не обойтись. Не сказал
бы, что дублирование - идеальный вариант, тут есть над чем поразмыслить.
> + flush_work(&sbi->s_error_work);
> kfree(raw_super);
> free_sbi:
> #ifdef CONFIG_DEBUG_LOCK_ALLOC
> --
> 2.25.1
More information about the lvc-project
mailing list