[linux] 01/01: [mips*] Fix ptrace handling of any syscalls returning ENOSYS.
debian-kernel at lists.debian.org
debian-kernel at lists.debian.org
Wed Aug 10 19:13:39 UTC 2016
This is an automated email from the git hooks/post-receive script.
aurel32 pushed a commit to branch jessie
in repository linux.
commit 1b039cf9e372804b9db60627b607b4f857f85fc9
Author: Aurelien Jarno <aurelien at aurel32.net>
Date: Tue Aug 9 22:06:30 2016 +0200
[mips*] Fix ptrace handling of any syscalls returning ENOSYS.
---
debian/changelog | 7 +
...ll-Always-run-the-seccomp-syscall-filters.patch | 283 +++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 291 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index cdcdc7b..782fc99 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+linux (3.16.36-2) UNRELEASED; urgency=medium
+
+ [ Aurelien Jarno ]
+ * [mips*] Fix ptrace handling of any syscalls returning ENOSYS.
+
+ -- Aurelien Jarno <aurel32 at debian.org> Tue, 09 Aug 2016 22:05:53 +0200
+
linux (3.16.36-1) jessie; urgency=medium
* New upstream stable update:
diff --git a/debian/patches/bugfix/mips/MIPS-scall-Always-run-the-seccomp-syscall-filters.patch b/debian/patches/bugfix/mips/MIPS-scall-Always-run-the-seccomp-syscall-filters.patch
new file mode 100644
index 0000000..d10a7ec
--- /dev/null
+++ b/debian/patches/bugfix/mips/MIPS-scall-Always-run-the-seccomp-syscall-filters.patch
@@ -0,0 +1,283 @@
+From: Markos Chandras <markos.chandras at imgtec.com>
+Date: Fri, 25 Sep 2015 08:17:42 +0100
+Subject: MIPS: scall: Always run the seccomp syscall filters
+Origin: https://git.kernel.org/linus/d218af78492a36a4ae607c08fedfb59258440314
+
+The MIPS syscall handler code used to return -ENOSYS on invalid
+syscalls. Whilst this is expected, it caused problems for seccomp
+filters because the said filters never had the change to run since
+the code returned -ENOSYS before triggering them. This caused
+problems on the chromium testsuite for filters looking for invalid
+syscalls. This has now changed and the seccomp filters are always
+run even if the syscall is invalid. We return -ENOSYS once we
+return from the seccomp filters. Moreover, similar codepaths have
+been merged in the process which simplifies somewhat the overall
+syscall code.
+
+Signed-off-by: Markos Chandras <markos.chandras at imgtec.com>
+Cc: linux-mips at linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/11236/
+Signed-off-by: Ralf Baechle <ralf at linux-mips.org>
+---
+ arch/mips/kernel/scall32-o32.S | 39 ++++++++++++++++-----------------------
+ arch/mips/kernel/scall64-64.S | 38 ++++++++++++++++----------------------
+ arch/mips/kernel/scall64-n32.S | 19 +++++--------------
+ arch/mips/kernel/scall64-o32.S | 19 +++++--------------
+ 4 files changed, 42 insertions(+), 73 deletions(-)
+
+diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
+index d06e30c..65a74e4 100644
+--- a/arch/mips/kernel/scall32-o32.S
++++ b/arch/mips/kernel/scall32-o32.S
+@@ -36,16 +36,8 @@ NESTED(handle_sys, PT_SIZE, sp)
+ lw t1, PT_EPC(sp) # skip syscall on return
+
+ subu v0, v0, __NR_O32_Linux # check syscall number
+- sltiu t0, v0, __NR_O32_Linux_syscalls + 1
+ addiu t1, 4 # skip to next instruction
+ sw t1, PT_EPC(sp)
+- beqz t0, illegal_syscall
+-
+- sll t0, v0, 2
+- la t1, sys_call_table
+- addu t1, t0
+- lw t2, (t1) # syscall routine
+- beqz t2, illegal_syscall
+
+ sw a3, PT_R26(sp) # save a3 for syscall restarting
+
+@@ -96,6 +88,16 @@ loads_done:
+ li t1, _TIF_WORK_SYSCALL_ENTRY
+ and t0, t1
+ bnez t0, syscall_trace_entry # -> yes
++syscall_common:
++ sltiu t0, v0, __NR_O32_Linux_syscalls + 1
++ beqz t0, illegal_syscall
++
++ sll t0, v0, 2
++ la t1, sys_call_table
++ addu t1, t0
++ lw t2, (t1) # syscall routine
++
++ beqz t2, illegal_syscall
+
+ jalr t2 # Do The Real Thing (TM)
+
+@@ -116,7 +118,7 @@ o32_syscall_exit:
+
+ syscall_trace_entry:
+ SAVE_STATIC
+- move s0, t2
++ move s0, v0
+ move a0, sp
+
+ /*
+@@ -129,27 +131,18 @@ syscall_trace_entry:
+
+ 1: jal syscall_trace_enter
+
+- bltz v0, 2f # seccomp failed? Skip syscall
++ bltz v0, 1f # seccomp failed? Skip syscall
++
++ move v0, s0 # restore syscall
+
+- move t0, s0
+ RESTORE_STATIC
+ lw a0, PT_R4(sp) # Restore argument registers
+ lw a1, PT_R5(sp)
+ lw a2, PT_R6(sp)
+ lw a3, PT_R7(sp)
+- jalr t0
+-
+- li t0, -EMAXERRNO - 1 # error?
+- sltu t0, t0, v0
+- sw t0, PT_R7(sp) # set error flag
+- beqz t0, 1f
+-
+- lw t1, PT_R2(sp) # syscall number
+- negu v0 # error
+- sw t1, PT_R0(sp) # save it for syscall restarting
+-1: sw v0, PT_R2(sp) # result
++ j syscall_common
+
+-2: j syscall_exit
++1: j syscall_exit
+
+ /* ------------------------------------------------------------------------ */
+
+diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
+index 428c2cd..e732981 100644
+--- a/arch/mips/kernel/scall64-64.S
++++ b/arch/mips/kernel/scall64-64.S
+@@ -39,18 +39,11 @@ NESTED(handle_sys64, PT_SIZE, sp)
+ .set at
+ #endif
+
+- dsubu t0, v0, __NR_64_Linux # check syscall number
+- sltiu t0, t0, __NR_64_Linux_syscalls + 1
+ #if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
+ ld t1, PT_EPC(sp) # skip syscall on return
+ daddiu t1, 4 # skip to next instruction
+ sd t1, PT_EPC(sp)
+ #endif
+- beqz t0, illegal_syscall
+-
+- dsll t0, v0, 3 # offset into table
+- ld t2, (sys_call_table - (__NR_64_Linux * 8))(t0)
+- # syscall routine
+
+ sd a3, PT_R26(sp) # save a3 for syscall restarting
+
+@@ -59,6 +52,17 @@ NESTED(handle_sys64, PT_SIZE, sp)
+ and t0, t1, t0
+ bnez t0, syscall_trace_entry
+
++syscall_common:
++ dsubu t2, v0, __NR_64_Linux
++ sltiu t0, t2, __NR_64_Linux_syscalls + 1
++ beqz t0, illegal_syscall
++
++ dsll t0, t2, 3 # offset into table
++ dla t2, sys_call_table
++ daddu t0, t2, t0
++ ld t2, (t0) # syscall routine
++ beqz t2, illegal_syscall
++
+ jalr t2 # Do The Real Thing (TM)
+
+ li t0, -EMAXERRNO - 1 # error?
+@@ -78,14 +82,14 @@ n64_syscall_exit:
+
+ syscall_trace_entry:
+ SAVE_STATIC
+- move s0, t2
++ move s0, v0
+ move a0, sp
+ move a1, v0
+ jal syscall_trace_enter
+
+- bltz v0, 2f # seccomp failed? Skip syscall
++ bltz v0, 1f # seccomp failed? Skip syscall
+
+- move t0, s0
++ move v0, s0
+ RESTORE_STATIC
+ ld a0, PT_R4(sp) # Restore argument registers
+ ld a1, PT_R5(sp)
+@@ -93,19 +97,9 @@ syscall_trace_entry:
+ ld a3, PT_R7(sp)
+ ld a4, PT_R8(sp)
+ ld a5, PT_R9(sp)
+- jalr t0
+-
+- li t0, -EMAXERRNO - 1 # error?
+- sltu t0, t0, v0
+- sd t0, PT_R7(sp) # set error flag
+- beqz t0, 1f
+-
+- ld t1, PT_R2(sp) # syscall number
+- dnegu v0 # error
+- sd t1, PT_R0(sp) # save it for syscall restarting
+-1: sd v0, PT_R2(sp) # result
++ j syscall_common
+
+-2: j syscall_exit
++1: j syscall_exit
+
+ illegal_syscall:
+ /* This also isn't a 64-bit syscall, throw an error. */
+diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
+index 3868cf4..c794843 100644
+--- a/arch/mips/kernel/scall64-n32.S
++++ b/arch/mips/kernel/scall64-n32.S
+@@ -52,6 +52,7 @@ NESTED(handle_sysn32, PT_SIZE, sp)
+ and t0, t1, t0
+ bnez t0, n32_syscall_trace_entry
+
++syscall_common:
+ jalr t2 # Do The Real Thing (TM)
+
+ li t0, -EMAXERRNO - 1 # error?
+@@ -75,9 +76,9 @@ n32_syscall_trace_entry:
+ move a1, v0
+ jal syscall_trace_enter
+
+- bltz v0, 2f # seccomp failed? Skip syscall
++ bltz v0, 1f # seccomp failed? Skip syscall
+
+- move t0, s0
++ move t2, s0
+ RESTORE_STATIC
+ ld a0, PT_R4(sp) # Restore argument registers
+ ld a1, PT_R5(sp)
+@@ -85,19 +86,9 @@ n32_syscall_trace_entry:
+ ld a3, PT_R7(sp)
+ ld a4, PT_R8(sp)
+ ld a5, PT_R9(sp)
+- jalr t0
++ j syscall_common
+
+- li t0, -EMAXERRNO - 1 # error?
+- sltu t0, t0, v0
+- sd t0, PT_R7(sp) # set error flag
+- beqz t0, 1f
+-
+- ld t1, PT_R2(sp) # syscall number
+- dnegu v0 # error
+- sd t1, PT_R0(sp) # save it for syscall restarting
+-1: sd v0, PT_R2(sp) # result
+-
+-2: j syscall_exit
++1: j syscall_exit
+
+ not_n32_scall:
+ /* This is not an n32 compatibility syscall, pass it on to
+diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
+index 6622980..6369cfd 100644
+--- a/arch/mips/kernel/scall64-o32.S
++++ b/arch/mips/kernel/scall64-o32.S
+@@ -87,6 +87,7 @@ loads_done:
+ and t0, t1, t0
+ bnez t0, trace_a_syscall
+
++syscall_common:
+ jalr t2 # Do The Real Thing (TM)
+
+ li t0, -EMAXERRNO - 1 # error?
+@@ -130,9 +131,9 @@ trace_a_syscall:
+
+ 1: jal syscall_trace_enter
+
+- bltz v0, 2f # seccomp failed? Skip syscall
++ bltz v0, 1f # seccomp failed? Skip syscall
+
+- move t0, s0
++ move t2, s0
+ RESTORE_STATIC
+ ld a0, PT_R4(sp) # Restore argument registers
+ ld a1, PT_R5(sp)
+@@ -142,19 +143,9 @@ trace_a_syscall:
+ ld a5, PT_R9(sp)
+ ld a6, PT_R10(sp)
+ ld a7, PT_R11(sp) # For indirect syscalls
+- jalr t0
++ j syscall_common
+
+- li t0, -EMAXERRNO - 1 # error?
+- sltu t0, t0, v0
+- sd t0, PT_R7(sp) # set error flag
+- beqz t0, 1f
+-
+- ld t1, PT_R2(sp) # syscall number
+- dnegu v0 # error
+- sd t1, PT_R0(sp) # save it for syscall restarting
+-1: sd v0, PT_R2(sp) # result
+-
+-2: j syscall_exit
++1: j syscall_exit
+
+ /* ------------------------------------------------------------------------ */
+
+--
+2.8.1
+
diff --git a/debian/patches/series b/debian/patches/series
index 2341f9c..ac7caf0 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -90,6 +90,7 @@ bugfix/mips/mips-correct-fp-isa-requirements.patch
bugfix/mips/mips-math-emu-correct-delay-slot-exception-propagation.patch
bugfix/mips/mips-math-emu-correctly-handle-nop-emulation.patch
bugfix/mips/MIPS-Allow-emulation-for-unaligned-LSDXC1-instructions.patch
+bugfix/mips/MIPS-scall-Always-run-the-seccomp-syscall-filters.patch
bugfix/x86/i2c-i801-Use-wait_event_timeout-to-wait-for-interrup.patch
bugfix/x86/kvm-x86-rename-update_db_bp_intercept-to-update_bp_i.patch
bugfix/x86/kvm-x86-bit-ops-emulation-ignores-offset-on-64-bit.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git
More information about the Kernel-svn-changes
mailing list