lkml.org 
[lkml]   [2021]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 17/62] ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE
    Date
    From: Takashi Iwai <tiwai@suse.de>

    [ Upstream commit 187bea472600dcc8d2eb714335053264dd437172 ]

    When CONFIG_FORTIFY_SOURCE is set, memcpy() checks the potential
    buffer overflow and panics. The code in sofcpga bootstrapping
    contains the memcpy() calls are mistakenly translated as the shorter
    size, hence it triggers a panic as if it were overflowing.

    This patch changes the secondary_trampoline and *_end definitions
    to arrays for avoiding the false-positive crash above.

    Fixes: 9c4566a117a6 ("ARM: socfpga: Enable SMP for socfpga")
    Suggested-by: Kees Cook <keescook@chromium.org>
    Buglink: https://bugzilla.suse.com/show_bug.cgi?id=1192473
    Link: https://lore.kernel.org/r/20211117193244.31162-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/mach-socfpga/core.h | 2 +-
    arch/arm/mach-socfpga/platsmp.c | 8 ++++----
    2 files changed, 5 insertions(+), 5 deletions(-)

    diff --git a/arch/arm/mach-socfpga/core.h b/arch/arm/mach-socfpga/core.h
    index 65e1817d8afe6..692a287a8712d 100644
    --- a/arch/arm/mach-socfpga/core.h
    +++ b/arch/arm/mach-socfpga/core.h
    @@ -48,7 +48,7 @@ extern void __iomem *sdr_ctl_base_addr;
    u32 socfpga_sdram_self_refresh(u32 sdr_base);
    extern unsigned int socfpga_sdram_self_refresh_sz;

    -extern char secondary_trampoline, secondary_trampoline_end;
    +extern char secondary_trampoline[], secondary_trampoline_end[];

    extern unsigned long socfpga_cpu1start_addr;

    diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c
    index 07945748b5714..1dfc9e7389a74 100644
    --- a/arch/arm/mach-socfpga/platsmp.c
    +++ b/arch/arm/mach-socfpga/platsmp.c
    @@ -31,14 +31,14 @@

    static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
    {
    - int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
    + int trampoline_size = secondary_trampoline_end - secondary_trampoline;

    if (socfpga_cpu1start_addr) {
    /* This will put CPU #1 into reset. */
    writel(RSTMGR_MPUMODRST_CPU1,
    rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST);

    - memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
    + memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);

    writel(virt_to_phys(secondary_startup),
    sys_manager_base_addr + (socfpga_cpu1start_addr & 0x000000ff));
    @@ -56,12 +56,12 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)

    static int socfpga_a10_boot_secondary(unsigned int cpu, struct task_struct *idle)
    {
    - int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
    + int trampoline_size = secondary_trampoline_end - secondary_trampoline;

    if (socfpga_cpu1start_addr) {
    writel(RSTMGR_MPUMODRST_CPU1, rst_manager_base_addr +
    SOCFPGA_A10_RSTMGR_MODMPURST);
    - memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
    + memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);

    writel(virt_to_phys(secondary_startup),
    sys_manager_base_addr + (socfpga_cpu1start_addr & 0x00000fff));
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-12-06 16:06    [W:4.107 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site