[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