• Masayoshi Mizuma's avatar
    arm64/sve: Fix wrong free for task->thread.sve_state · 3766c9d9
    Masayoshi Mizuma authored
    commit 4585fc59 upstream.
    
    The system which has SVE feature crashed because of
    the memory pointed by task->thread.sve_state was destroyed
    by someone.
    
    That is because sve_state is freed while the forking the
    child process. The child process has the pointer of sve_state
    which is same as the parent's because the child's task_struct
    is copied from the parent's one. If the copy_process()
    fails as an error on somewhere, for example, copy_creds(),
    then the sve_state is freed even if the parent is alive.
    The flow is as follows.
    
    copy_process
            p = dup_task_struct
                => arch_dup_task_struct
                    *dst = *src;  // copy the entire region.
    :
            retval = copy_creds
            if (retval < 0)
                    goto bad_fork_free;
    :
    bad_fork_free:
    ...
            delayed_free_task(p);
              => free_task
                 => arch_release_task_struct
                    => fpsimd_release_task
                       => __sve_free
                          => kfree(task->thread.sve_state);
                             // free the parent's sve_state
    
    Move child's sve_state = NULL and clearing TIF_SVE flag
    to arch_dup_task_struct() so that the child doesn't free the
    parent's one.
    There is no need to wait until copy_process() to clear TIF_SVE for
    dst, because the thread flags for dst are initialized already by
    copying the src task_struct.
    This change simplifies the code, so get rid of comments that are no
    longer needed.
    
    As a note, arm64 used to have thread_info on the stack. So it
    would not be possible to clear TIF_SVE until the stack is initialized.
    From commit c02433dd ("arm64: split thread_info from task stack"),
    the thread_info is part of the task, so it should be valid to modify
    the flag from arch_dup_task_struct().
    
    Cc: stable@vger.kernel.org # 4.15.x-
    Fixes: bc0ee476 ("arm64/sve: Core task context handling")
    Signed-off-by: default avatarMasayoshi Mizuma <m.mizuma@jp.fujitsu.com>
    Reported-by: default avatarHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
    Suggested-by: default avatarDave Martin <Dave.Martin@arm.com>
    Reviewed-by: default avatarDave Martin <Dave.Martin@arm.com>
    Tested-by: default avatarJulien Grall <julien.grall@arm.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3766c9d9
process.c 13.6 KB