lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 220/329] ARM: 8748/1: mm: Define vdso_start, vdso_end as array
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jinbum Park <jinb.park7@gmail.com>

    [ Upstream commit 73b9160d0dfe44dfdaffd6465dc1224c38a4a73c ]

    Define vdso_start, vdso_end as array to avoid compile-time analysis error
    for the case of built with CONFIG_FORTIFY_SOURCE.

    and, since vdso_start, vdso_end are used in vdso.c only,
    move extern-declaration from vdso.h to vdso.c.

    If kernel is built with CONFIG_FORTIFY_SOURCE,
    compile-time error happens at this code.
    - if (memcmp(&vdso_start, "177ELF", 4))

    The size of "&vdso_start" is recognized as 1 byte, but n is 4,
    So that compile-time error is reported.

    Acked-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Jinbum Park <jinb.park7@gmail.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/arm/include/asm/vdso.h | 2 --
    arch/arm/kernel/vdso.c | 12 +++++++-----
    2 files changed, 7 insertions(+), 7 deletions(-)

    --- a/arch/arm/include/asm/vdso.h
    +++ b/arch/arm/include/asm/vdso.h
    @@ -11,8 +11,6 @@ struct mm_struct;

    void arm_install_vdso(struct mm_struct *mm, unsigned long addr);

    -extern char vdso_start, vdso_end;
    -
    extern unsigned int vdso_total_pages;

    #else /* CONFIG_VDSO */
    --- a/arch/arm/kernel/vdso.c
    +++ b/arch/arm/kernel/vdso.c
    @@ -39,6 +39,8 @@

    static struct page **vdso_text_pagelist;

    +extern char vdso_start[], vdso_end[];
    +
    /* Total number of pages needed for the data and text portions of the VDSO. */
    unsigned int vdso_total_pages __ro_after_init;

    @@ -179,13 +181,13 @@ static int __init vdso_init(void)
    unsigned int text_pages;
    int i;

    - if (memcmp(&vdso_start, "\177ELF", 4)) {
    + if (memcmp(vdso_start, "\177ELF", 4)) {
    pr_err("VDSO is not a valid ELF object!\n");
    return -ENOEXEC;
    }

    - text_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT;
    - pr_debug("vdso: %i text pages at base %p\n", text_pages, &vdso_start);
    + text_pages = (vdso_end - vdso_start) >> PAGE_SHIFT;
    + pr_debug("vdso: %i text pages at base %p\n", text_pages, vdso_start);

    /* Allocate the VDSO text pagelist */
    vdso_text_pagelist = kcalloc(text_pages, sizeof(struct page *),
    @@ -200,7 +202,7 @@ static int __init vdso_init(void)
    for (i = 0; i < text_pages; i++) {
    struct page *page;

    - page = virt_to_page(&vdso_start + i * PAGE_SIZE);
    + page = virt_to_page(vdso_start + i * PAGE_SIZE);
    vdso_text_pagelist[i] = page;
    }

    @@ -211,7 +213,7 @@ static int __init vdso_init(void)

    cntvct_ok = cntvct_functional();

    - patch_vdso(&vdso_start);
    + patch_vdso(vdso_start);

    return 0;
    }

    \
     
     \ /
      Last update: 2018-05-28 16:11    [W:4.139 / U:24.888 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site