• Mark Rutland's avatar
    arm64: hibernate: handle allocation failures · dfbca61a
    Mark Rutland authored
    In create_safe_exec_page(), we create a copy of the hibernate exit text,
    along with some page tables to map this via TTBR0. We then install the
    new tables in TTBR0.
    
    In swsusp_arch_resume() we call create_safe_exec_page() before trying a
    number of operations which may fail (e.g. copying the linear map page
    tables). If these fail, we bail out of swsusp_arch_resume() and return
    an error code, but leave TTBR0 as-is. Subsequently, the core hibernate
    code will call free_basic_memory_bitmaps(), which will free all of the
    memory allocations we made, including the page tables installed in
    TTBR0.
    
    Thus, we may have TTBR0 pointing at dangling freed memory for some
    period of time. If the hibernate attempt was triggered by a user
    requesting a hibernate test via the reboot syscall, we may return to
    userspace with the clobbered TTBR0 value.
    
    Avoid these issues by reorganising swsusp_arch_resume() such that we
    have no failure paths after create_safe_exec_page(). We also add a check
    that the zero page allocation succeeded, matching what we have for other
    allocations.
    
    Fixes: 82869ac5 ("arm64: kernel: Add support for hibernate/suspend-to-disk")
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarJames Morse <james.morse@arm.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: <stable@vger.kernel.org> # 4.7+
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    dfbca61a
hibernate.c 13 KB