• Zhihao Cheng's avatar
    ubi: check kthread_should_stop() after the setting of task state · d005f8c6
    Zhihao Cheng authored
    A detach hung is possible when a race occurs between the detach process
    and the ubi background thread. The following sequences outline the race:
    
      ubi thread: if (list_empty(&ubi->works)...
    
      ubi detach: set_bit(KTHREAD_SHOULD_STOP, &kthread->flags)
                  => by kthread_stop()
                  wake_up_process()
                  => ubi thread is still running, so 0 is returned
    
      ubi thread: set_current_state(TASK_INTERRUPTIBLE)
                  schedule()
                  => ubi thread will never be scheduled again
    
      ubi detach: wait_for_completion()
                  => hung task!
    
    To fix that, we need to check kthread_should_stop() after we set the
    task state, so the ubi thread will either see the stop bit and exit or
    the task state is reset to runnable such that it isn't scheduled out
    indefinitely.
    Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
    Cc: <stable@vger.kernel.org>
    Fixes: 801c135c ("UBI: Unsorted Block Images")
    Reported-by: syzbot+853639d0cb16c31c7a14@syzkaller.appspotmail.com
    Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
    d005f8c6
wl.c 55.5 KB