lkml.org 
[lkml]   [2019]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 075/106] mips: properly account for stack randomization and stack guard gap
    Date
    From: Alexandre Ghiti <alex@ghiti.fr>

    [ Upstream commit b1f61b5bde3a1f50392c97b4c8513d1b8efb1cf2 ]

    This commit takes care of stack randomization and stack guard gap when
    computing mmap base address and checks if the task asked for
    randomization. This fixes the problem uncovered and not fixed for arm
    here: https://lkml.kernel.org/r/20170622200033.25714-1-riel@redhat.com

    Link: http://lkml.kernel.org/r/20190730055113.23635-10-alex@ghiti.fr
    Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
    Acked-by: Kees Cook <keescook@chromium.org>
    Acked-by: Paul Burton <paul.burton@mips.com>
    Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
    Cc: Albert Ou <aou@eecs.berkeley.edu>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: James Hogan <jhogan@kernel.org>
    Cc: Palmer Dabbelt <palmer@sifive.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/mips/mm/mmap.c | 14 ++++++++++++--
    1 file changed, 12 insertions(+), 2 deletions(-)

    diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c
    index 1b705fb2f10c4..233033f99d8fc 100644
    --- a/arch/mips/mm/mmap.c
    +++ b/arch/mips/mm/mmap.c
    @@ -21,8 +21,9 @@ unsigned long shm_align_mask = PAGE_SIZE - 1; /* Sane caches */
    EXPORT_SYMBOL(shm_align_mask);

    /* gap between mmap and stack */
    -#define MIN_GAP (128*1024*1024UL)
    -#define MAX_GAP ((TASK_SIZE)/6*5)
    +#define MIN_GAP (128*1024*1024UL)
    +#define MAX_GAP ((TASK_SIZE)/6*5)
    +#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12))

    static int mmap_is_legacy(struct rlimit *rlim_stack)
    {
    @@ -38,6 +39,15 @@ static int mmap_is_legacy(struct rlimit *rlim_stack)
    static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack)
    {
    unsigned long gap = rlim_stack->rlim_cur;
    + unsigned long pad = stack_guard_gap;
    +
    + /* Account for stack randomization if necessary */
    + if (current->flags & PF_RANDOMIZE)
    + pad += (STACK_RND_MASK << PAGE_SHIFT);
    +
    + /* Values close to RLIM_INFINITY can overflow. */
    + if (gap + pad > gap)
    + gap += pad;

    if (gap < MIN_GAP)
    gap = MIN_GAP;
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-06 19:31    [W:2.534 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site