FAILED: patch "[PATCH] arm64: compat: Don't pull syscall number from regs in" failed to apply to 4.19-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 53290432145a8eb143fe29e06e9c1465d43dc723 Mon Sep 17 00:00:00 2001
From: Will Deacon <[email protected]>
Date: Thu, 3 Jan 2019 18:00:39 +0000
Subject: [PATCH] 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.
arch/arm64/kernel/sys_compat.c +4 -5
@@ -66,12 +66,11 @@ do_compat_cache_op(unsigned long start, unsigned long end, int flags)/* * Handle all unrecognised system calls. */ -long compat_arm_syscall (struct pt_regs *regs) +long compat_arm_syscall (struct pt_regs *regs,int scno) { -unsigned int no = regs->regs[7 ];void __user *addr; -switch (no) { +switch (scno) {/* * Flush a region from virtual address 'r0' to virtual address 'r1' * _exclusive_. There is no alignment requirement on either address;
@@ -107,7 +106,7 @@ long compat_arm_syscall(struct pt_regs *regs)* way the calling program can gracefully determine whether * a feature is supported. */ -if (no < __ARM_NR_COMPAT_END) +if (scno < __ARM_NR_COMPAT_END)return -ENOSYS ;break ; }
@@ -116,6 +115,6 @@ long compat_arm_syscall(struct pt_regs *regs) (compat_thumb_mode (regs) ?2 :4 );arm64_notify_die ("Oops - bad compat syscall(2)" , regs, -SIGILL ,ILL_ILLTRP , addr, no); +SIGILL ,ILL_ILLTRP , addr, scno);return 0 ; }
arch/arm64/kernel/syscall.c +4 -5
@@ -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;
Will Deacon
Reviewed-by Dave MartinQuoted 18 lines · On Mon, Jan 07, 2019 at 10:40:11AM +0100, [email protected] wrote:
The patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
53290432145a8eb143fe29e06e9c1465d43dc723Mon Sep 17 00:00:00 2001
From: Will Deacon <[email protected]>
Date: Thu, 3 Jan 2019 18:00:39 +0000
Subject: [PATCH] arm64: compat: Don't pull syscall number from regs in
arm_compat_syscall
Quoted 3 lines
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.
Fixed patch below. I don't think we need to consider kernels prior to 4.19.
Will
--->8
From 7e5f7c4e6fd50fe216fa53d9343141fbf1547a10 Mon Sep 17 00:00:00 2001
From: Will Deacon <[email protected]>
Date: Thu, 3 Jan 2019 18:00:39 +0000
Subject: [PATCH] arm64: compat: Don't pull syscall number from regs in
arm_compat_syscall
Commit 53290432145a8eb143fe29e06e9c1465d43dc723 upstream.
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.
--- arch/arm64/kernel/sys_compat.c | 9 ++++----- arch/arm64/kernel/syscall.c | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-)
arch/arm64/kernel/sys_compat.c +4 -5
@@ -66,12 +66,11 @@ do_compat_cache_op(unsigned long start, unsigned long end, int flags)/* * Handle all unrecognised system calls. */ -long compat_arm_syscall (struct pt_regs *regs) +long compat_arm_syscall (struct pt_regs *regs,int scno) {siginfo_t info; -unsigned int no = regs->regs[7 ]; -switch (no) { +switch (scno) {/* * Flush a region from virtual address 'r0' to virtual address 'r1' * _exclusive_. There is no alignment requirement on either address;
@@ -107,7 +106,7 @@ long compat_arm_syscall(struct pt_regs *regs)* way the calling program can gracefully determine whether * a feature is supported. */ -if (no < __ARM_NR_COMPAT_END) +if (scno < __ARM_NR_COMPAT_END)return -ENOSYS ;break ; }
@@ -119,6 +118,6 @@ long compat_arm_syscall(struct pt_regs *regs) info.si_addr = (void __user *)instruction_pointer (regs) - (compat_thumb_mode (regs) ?2 :4 ); -arm64_notify_die ("Oops - bad compat syscall(2)" , regs, &info, no); +arm64_notify_die ("Oops - bad compat syscall(2)" , regs, &info, scno);return 0 ; }
arch/arm64/kernel/syscall.c +4 -5
@@ -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;
Signature · 1 line
2.11.0
Greg KH
maintainerQuoted 19 lines · Will Deacon
Quoted 18 lines · On Mon, Jan 07, 2019 at 10:40:11AM +0100, [email protected] wrote:
The patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
53290432145a8eb143fe29e06e9c1465d43dc723Mon Sep 17 00:00:00 2001
From: Will Deacon <[email protected]>
Date: Thu, 3 Jan 2019 18:00:39 +0000
Subject: [PATCH] arm64: compat: Don't pull syscall number from regs in
arm_compat_syscall
Quoted 5 lines
Quoted 3 lines
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.
Fixed patch below. I don't think we need to consider kernels prior to 4.19.
Now applied, thanks.
greg k-h