• H
    s390/pfault: fix task state race · d5e50a51
    Heiko Carstens 提交于
    When setting the current task state to TASK_UNINTERRUPTIBLE this can
    race with a different cpu. The other cpu could set the task state after
    it inspected it (while it was still TASK_RUNNING) to TASK_RUNNING which
    would change the state from TASK_UNINTERRUPTIBLE to TASK_RUNNING again.
    
    This race was always present in the pfault interrupt code but didn't
    cause anything harmful before commit f2db2e6c "[S390] pfault: cpu hotplug
    vs missing completion interrupts" which relied on the fact that after
    setting the task state to TASK_UNINTERRUPTIBLE the task would really
    sleep.
    Since this is not necessarily the case the result may be a list corruption
    of the pfault_list or, as observed, a use-after-free bug while trying to
    access the task_struct of a task which terminated itself already.
    
    To fix this, we need to get a reference of the affected task when receiving
    the initial pfault interrupt and add special handling if we receive yet
    another initial pfault interrupt when the task is already enqueued in the
    pfault list.
    Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
    Reviewed-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: <stable@vger.kernel.org> # needed for v3.0 and newer
    Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
    d5e50a51
fault.c 16.6 KB