lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 608/639] arm64: hibernate: check pgd table allocation
    Date
    From: Pavel Tatashin <pasha.tatashin@soleen.com>

    [ Upstream commit 8c551f919a73c1dfa690a70a691be1da394145e8 ]

    There is a bug in create_safe_exec_page(), when page table is allocated
    it is not checked that table is allocated successfully:

    But it is dereferenced in: pgd_none(READ_ONCE(*pgdp)). Check that
    allocation was successful.

    Fixes: 82869ac57b5d ("arm64: kernel: Add support for hibernate/suspend-to-disk")
    Reviewed-by: James Morse <james.morse@arm.com>
    Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/kernel/hibernate.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
    index 9859e1178e6be..dbeeeffdb9c9e 100644
    --- a/arch/arm64/kernel/hibernate.c
    +++ b/arch/arm64/kernel/hibernate.c
    @@ -202,6 +202,7 @@ static int create_safe_exec_page(void *src_start, size_t length,
    gfp_t mask)
    {
    int rc = 0;
    + pgd_t *trans_pgd;
    pgd_t *pgdp;
    pud_t *pudp;
    pmd_t *pmdp;
    @@ -216,7 +217,13 @@ static int create_safe_exec_page(void *src_start, size_t length,
    memcpy((void *)dst, src_start, length);
    __flush_icache_range(dst, dst + length);

    - pgdp = pgd_offset_raw(allocator(mask), dst_addr);
    + trans_pgd = allocator(mask);
    + if (!trans_pgd) {
    + rc = -ENOMEM;
    + goto out;
    + }
    +
    + pgdp = pgd_offset_raw(trans_pgd, dst_addr);
    if (pgd_none(READ_ONCE(*pgdp))) {
    pudp = allocator(mask);
    if (!pudp) {
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:34    [W:4.108 / U:0.684 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site