lkml.org 
[lkml]   [2019]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.1 58/70] arm64: use the correct function type for __arm64_sys_ni_syscall
    Date
    From: Sami Tolvanen <samitolvanen@google.com>

    [ Upstream commit 1e29ab3186e33c77dbb2d7566172a205b59fa390 ]

    Calling sys_ni_syscall through a syscall_fn_t pointer trips indirect
    call Control-Flow Integrity checking due to a function type
    mismatch. Use SYSCALL_DEFINE0 for __arm64_sys_ni_syscall instead and
    remove the now unnecessary casts.

    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/kernel/sys.c | 14 +++++++++-----
    arch/arm64/kernel/sys32.c | 7 ++-----
    2 files changed, 11 insertions(+), 10 deletions(-)

    diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c
    index 6f91e8116514..d8b35cfe5e94 100644
    --- a/arch/arm64/kernel/sys.c
    +++ b/arch/arm64/kernel/sys.c
    @@ -47,22 +47,26 @@ SYSCALL_DEFINE1(arm64_personality, unsigned int, personality)
    return ksys_personality(personality);
    }

    +asmlinkage long sys_ni_syscall(void);
    +
    +asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused)
    +{
    + return sys_ni_syscall();
    +}
    +
    /*
    * Wrappers to pass the pt_regs argument.
    */
    #define sys_personality sys_arm64_personality

    -asmlinkage long sys_ni_syscall(const struct pt_regs *);
    -#define __arm64_sys_ni_syscall sys_ni_syscall
    -
    #undef __SYSCALL
    #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *);
    #include <asm/unistd.h>

    #undef __SYSCALL
    -#define __SYSCALL(nr, sym) [nr] = (syscall_fn_t)__arm64_##sym,
    +#define __SYSCALL(nr, sym) [nr] = __arm64_##sym,

    const syscall_fn_t sys_call_table[__NR_syscalls] = {
    - [0 ... __NR_syscalls - 1] = (syscall_fn_t)sys_ni_syscall,
    + [0 ... __NR_syscalls - 1] = __arm64_sys_ni_syscall,
    #include <asm/unistd.h>
    };
    diff --git a/arch/arm64/kernel/sys32.c b/arch/arm64/kernel/sys32.c
    index 0f8bcb7de700..3c80a40c1c9d 100644
    --- a/arch/arm64/kernel/sys32.c
    +++ b/arch/arm64/kernel/sys32.c
    @@ -133,17 +133,14 @@ COMPAT_SYSCALL_DEFINE6(aarch32_fallocate, int, fd, int, mode,
    return ksys_fallocate(fd, mode, arg_u64(offset), arg_u64(len));
    }

    -asmlinkage long sys_ni_syscall(const struct pt_regs *);
    -#define __arm64_sys_ni_syscall sys_ni_syscall
    -
    #undef __SYSCALL
    #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *);
    #include <asm/unistd32.h>

    #undef __SYSCALL
    -#define __SYSCALL(nr, sym) [nr] = (syscall_fn_t)__arm64_##sym,
    +#define __SYSCALL(nr, sym) [nr] = __arm64_##sym,

    const syscall_fn_t compat_sys_call_table[__NR_compat_syscalls] = {
    - [0 ... __NR_compat_syscalls - 1] = (syscall_fn_t)sys_ni_syscall,
    + [0 ... __NR_compat_syscalls - 1] = __arm64_sys_ni_syscall,
    #include <asm/unistd32.h>
    };
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-06-08 13:42    [W:4.296 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site