[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