lkml.org 
[lkml]   [2015]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 05/10] powerpc: standardize mmap_rnd() usage
    Date
    In preparation for splitting out ET_DYN ASLR, this refactors the use of
    mmap_rnd() to be used similarly to arm and x86.

    Signed-off-by: Kees Cook <keescook@chromium.org>
    ---
    Can mmap ASLR be safely enabled in the legacy mmap case here? Other archs
    use "mm->mmap_base = TASK_UNMAPPED_BASE + random_factor".
    ---
    arch/powerpc/mm/mmap.c | 26 +++++++++++++++-----------
    1 file changed, 15 insertions(+), 11 deletions(-)

    diff --git a/arch/powerpc/mm/mmap.c b/arch/powerpc/mm/mmap.c
    index cb8bdbe4972f..3d7088bfe93c 100644
    --- a/arch/powerpc/mm/mmap.c
    +++ b/arch/powerpc/mm/mmap.c
    @@ -55,19 +55,18 @@ static inline int mmap_is_legacy(void)

    static unsigned long mmap_rnd(void)
    {
    - unsigned long rnd = 0;
    + unsigned long rnd;
    +
    + /* 8MB for 32bit, 1GB for 64bit */
    + if (is_32bit_task())
    + rnd = (unsigned long)get_random_int() % (1<<(23-PAGE_SHIFT));
    + else
    + rnd = (unsigned long)get_random_int() % (1<<(30-PAGE_SHIFT));

    - if (current->flags & PF_RANDOMIZE) {
    - /* 8MB for 32bit, 1GB for 64bit */
    - if (is_32bit_task())
    - rnd = (long)(get_random_int() % (1<<(23-PAGE_SHIFT)));
    - else
    - rnd = (long)(get_random_int() % (1<<(30-PAGE_SHIFT)));
    - }
    return rnd << PAGE_SHIFT;
    }

    -static inline unsigned long mmap_base(void)
    +static inline unsigned long mmap_base(unsigned long base)
    {
    unsigned long gap = rlimit(RLIMIT_STACK);

    @@ -76,7 +75,7 @@ static inline unsigned long mmap_base(void)
    else if (gap > MAX_GAP)
    gap = MAX_GAP;

    - return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd());
    + return PAGE_ALIGN(TASK_SIZE - gap - base);
    }

    /*
    @@ -85,6 +84,11 @@ static inline unsigned long mmap_base(void)
    */
    void arch_pick_mmap_layout(struct mm_struct *mm)
    {
    + unsigned long random_factor = 0UL;
    +
    + if (current->flags & PF_RANDOMIZE)
    + random_factor = mmap_rnd();
    +
    /*
    * Fall back to the standard layout if the personality
    * bit is set, or if the expected stack growth is unlimited:
    @@ -93,7 +97,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
    mm->mmap_base = TASK_UNMAPPED_BASE;
    mm->get_unmapped_area = arch_get_unmapped_area;
    } else {
    - mm->mmap_base = mmap_base();
    + mm->mmap_base = mmap_base(random_factor);
    mm->get_unmapped_area = arch_get_unmapped_area_topdown;
    }
    }
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-03-04 03:21    [W:4.057 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site