• Mark Brown's avatar
    arm64/sve: Use correct size when reinitialising SVE state · e35ac9d0
    Mark Brown authored
    When we need a buffer for SVE register state we call sve_alloc() to make
    sure that one is there. In order to avoid repeated allocations and frees
    we keep the buffer around unless we change vector length and just memset()
    it to ensure a clean register state. The function that deals with this
    takes the task to operate on as an argument, however in the case where we
    do a memset() we initialise using the SVE state size for the current task
    rather than the task passed as an argument.
    
    This is only an issue in the case where we are setting the register state
    for a task via ptrace and the task being configured has a different vector
    length to the task tracing it. In the case where the buffer is larger in
    the traced process we will leak old state from the traced process to
    itself, in the case where the buffer is smaller in the traced process we
    will overflow the buffer and corrupt memory.
    
    Fixes: bc0ee476 ("arm64/sve: Core task context handling")
    Cc: <stable@vger.kernel.org> # 4.15.x
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210909165356.10675-1-broonie@kernel.orgSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    e35ac9d0
fpsimd.c 39.2 KB