diff options
author | Will Deacon <will.deacon@arm.com> | 2019-01-03 18:00:39 +0000 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2019-01-04 14:18:01 +0000 |
commit | 53290432145a8eb143fe29e06e9c1465d43dc723 (patch) | |
tree | 1312ac6856bc9d350194a75b1e6a4f219f8c98b0 /arch/arm64/kernel/syscall.c | |
parent | 169113ece0f29ebe884a6cfcf57c1ace04d8a36a (diff) | |
download | linux-53290432145a8eb143fe29e06e9c1465d43dc723.tar.gz linux-53290432145a8eb143fe29e06e9c1465d43dc723.tar.bz2 linux-53290432145a8eb143fe29e06e9c1465d43dc723.zip |
arm64: compat: Don't pull syscall number from regs in arm_compat_syscall
The syscall number may have been changed by a tracer, so we should pass
the actual number in from the caller instead of pulling it from the
saved r7 value directly.
Cc: <stable@vger.kernel.org>
Cc: Pi-Hsun Shih <pihsun@chromium.org>
Reviewed-by: Dave Martin <Dave.Martin@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/kernel/syscall.c')
-rw-r--r-- | arch/arm64/kernel/syscall.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 032d22312881..5610ac01c1ec 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -13,16 +13,15 @@ #include <asm/thread_info.h> #include <asm/unistd.h> -long compat_arm_syscall(struct pt_regs *regs); - +long compat_arm_syscall(struct pt_regs *regs, int scno); long sys_ni_syscall(void); -asmlinkage long do_ni_syscall(struct pt_regs *regs) +static long do_ni_syscall(struct pt_regs *regs, int scno) { #ifdef CONFIG_COMPAT long ret; if (is_compat_task()) { - ret = compat_arm_syscall(regs); + ret = compat_arm_syscall(regs, scno); if (ret != -ENOSYS) return ret; } @@ -47,7 +46,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno, syscall_fn = syscall_table[array_index_nospec(scno, sc_nr)]; ret = __invoke_syscall(regs, syscall_fn); } else { - ret = do_ni_syscall(regs); + ret = do_ni_syscall(regs, scno); } regs->regs[0] = ret; |