lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 060/192] powerpc/hugetlb: Handle mmap_min_addr correctly in get_unmapped_area callback
    Date
    From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>

    [ Upstream commit 5330367fa300742a97e20e953b1f77f48392faae ]

    After we ALIGN up the address we need to make sure we didn't overflow
    and resulted in zero address. In that case, we need to make sure that
    the returned address is greater than mmap_min_addr.

    This fixes selftest va_128TBswitch --run-hugetlb reporting failures when
    run as non root user for

    mmap(-1, MAP_HUGETLB)

    The bug is that a non-root user requesting address -1 will be given address 0
    which will then fail, whereas they should have been given something else that
    would have succeeded.

    We also avoid the first mmap(-1, MAP_HUGETLB) returning NULL address as mmap address
    with this change. So we think this is not a security issue, because it only affects
    whether we choose an address below mmap_min_addr, not whether we
    actually allow that address to be mapped. ie. there are existing capability
    checks to prevent a user mapping below mmap_min_addr and those will still be
    honoured even without this fix.

    Fixes: 484837601d4d ("powerpc/mm: Add radix support for hugetlb")
    Reviewed-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/mm/hugetlbpage-radix.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c
    index 2486bee0f93e..97c7a39ebc00 100644
    --- a/arch/powerpc/mm/hugetlbpage-radix.c
    +++ b/arch/powerpc/mm/hugetlbpage-radix.c
    @@ -1,6 +1,7 @@
    // SPDX-License-Identifier: GPL-2.0
    #include <linux/mm.h>
    #include <linux/hugetlb.h>
    +#include <linux/security.h>
    #include <asm/pgtable.h>
    #include <asm/pgalloc.h>
    #include <asm/cacheflush.h>
    @@ -73,7 +74,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
    if (addr) {
    addr = ALIGN(addr, huge_page_size(h));
    vma = find_vma(mm, addr);
    - if (high_limit - len >= addr &&
    + if (high_limit - len >= addr && addr >= mmap_min_addr &&
    (!vma || addr + len <= vm_start_gap(vma)))
    return addr;
    }
    @@ -83,7 +84,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
    */
    info.flags = VM_UNMAPPED_AREA_TOPDOWN;
    info.length = len;
    - info.low_limit = PAGE_SIZE;
    + info.low_limit = max(PAGE_SIZE, mmap_min_addr);
    info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW);
    info.align_mask = PAGE_MASK & ~huge_page_mask(h);
    info.align_offset = 0;
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-27 19:12    [W:4.066 / U:0.648 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site