[lvc-project] [PATCH] jffs2: fix use-after-free in jffs2_garbage_collect_thread()
Fedor Pchelkin
pchelkin at ispras.ru
Thu Mar 26 09:31:16 MSK 2026
On Thu, 26. Mar 10:15, Zhihao Cheng wrote:
> 在 2026/3/23 17:21, Dmitriy Chumachenko 写道:
> > @@ -160,6 +160,7 @@ static int jffs2_garbage_collect_thread(void *_c)
> > die:
> > spin_lock(&c->erase_completion_lock);
> > c->gc_task = NULL;
> > + complete(&c->gc_thread_exit);
> > spin_unlock(&c->erase_completion_lock);
> > - kthread_complete_and_exit(&c->gc_thread_exit, 0);
> > + kthread_exit(0);
> > }
> >
>
> Hi, I think the UAF could still happen even this patch is applied.
>
> jffs2_kill_sb jffs2_garbage_collect_thread
> jffs2_stop_garbage_collect_thread
> spin_lock(&c->erase_completion_lock)
> send_sig(SIGKILL, c->gc_task, 1)
> wait = 1
> spin_unlock(&c->erase_completion_lock)
> goto die // receive kill SIGKILL
> spin_lock(&c->erase_completion_lock)
> complete(&c->gc_thread_exit)
> wait_for_completion(&c->gc_thread_exit) // don't wait
> kfree(c)
> spin_unlock(&c->erase_completion_lock)
Угу, Жихао прав. Поторопились мы, здесь ведь спинлок тоже берётся по
указателю 'c'. Пока откатываю патч, исправление нужно будет делать
другим образом.
[ кстати, как видите, схема вызовов функций в конкурирующих потоках
наглядно помогает понять, что к чему; рекомендую её набрасывать в
описании патча при исправлениях гонок ]
More information about the lvc-project
mailing list