[kernel] r21654 - in dists/sid/linux/debian: . patches patches/bugfix/mips
Aurelien Jarno
aurel32 at moszumanska.debian.org
Wed Jul 30 19:12:58 UTC 2014
Author: aurel32
Date: Wed Jul 30 19:12:58 2014
New Revision: 21654
Log:
[mips,mipsel/4kc-malta] Fix bug which can cause incorrect system call
restarts (fix hang on boot).
Added:
dists/sid/linux/debian/patches/bugfix/mips/MIPS-O32-32-bit-Fix-bug-which-can-cause-incorrect-sy.patch
Modified:
dists/sid/linux/debian/changelog
dists/sid/linux/debian/patches/series
Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog Wed Jul 30 19:11:50 2014 (r21653)
+++ dists/sid/linux/debian/changelog Wed Jul 30 19:12:58 2014 (r21654)
@@ -8,6 +8,8 @@
* Rewrite postinst to not require File::stat perl module (Closes: #756207).
* [mips*] Avoid smp_processor_id() in preemptible code.
* [mips*/octeon] Fix /proc/cpuinfo issues.
+ * [mips,mipsel/4kc-malta] Fix bug which can cause incorrect system call
+ restarts (fix hang on boot).
[ Ben Hutchings ]
* [amd64] Reject x32 executables if x32 ABI not supported
Added: dists/sid/linux/debian/patches/bugfix/mips/MIPS-O32-32-bit-Fix-bug-which-can-cause-incorrect-sy.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/mips/MIPS-O32-32-bit-Fix-bug-which-can-cause-incorrect-sy.patch Wed Jul 30 19:12:58 2014 (r21654)
@@ -0,0 +1,61 @@
+From: Alex Smith <alex.smith at imgtec.com>
+Date: Wed, 23 Jul 2014 14:40:11 +0100
+Subject: MIPS: O32/32-bit: Fix bug which can cause incorrect system
+ call restarts
+Origin: http://www.linux-mips.org/archives/linux-mips/2014-07/msg00548.html
+
+On 32-bit/O32, pt_regs has a padding area at the beginning into which the
+syscall arguments passed via the user stack are copied. 4 arguments
+totalling 16 bytes are copied to offset 16 bytes into this area, however
+the area is only 24 bytes long. This means the last 2 arguments overwrite
+pt_regs->regs[{0,1}].
+
+If a syscall function returns an error, handle_sys stores the original
+syscall number in pt_regs->regs[0] for syscall restart. signal.c checks
+whether regs[0] is non-zero, if it is it will check whether the syscall
+return value is one of the ERESTART* codes to see if it must be
+restarted.
+
+Should a syscall be made that results in a non-zero value being copied
+off the user stack into regs[0], and then returns a positive (non-error)
+value that matches one of the ERESTART* error codes, this can be mistaken
+for requiring a syscall restart.
+
+While the possibility for this to occur has always existed, it is made
+much more likely to occur by commit 46e12c07b3b9 ("MIPS: O32 / 32-bit:
+Always copy 4 stack arguments."), since now every syscall will copy 4
+arguments and overwrite regs[0], rather than just those with 7 or 8
+arguments.
+
+Since that commit, booting Debian under a 32-bit MIPS kernel almost
+always results in a hang early in boot, due to a wait4 syscall returning
+a PID that matches one of the ERESTART* codes, which then causes an
+incorrect restart of the syscall.
+
+The problem is fixed by increasing the size of the padding area so that
+arguments copied off the stack will not overwrite pt_regs->regs[{0,1}].
+
+Signed-off-by: Alex Smith <alex.smith at imgtec.com>
+Cc: <stable at vger.kernel.org> # v3.13+
+Tested-by: Aurelien Jarno <aurelien at aurel32.net>
+Reviewed-by: Aurelien Jarno <aurelien at aurel32.net>
+---
+ arch/mips/include/asm/ptrace.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h
+index 7e6e682..c301fa9 100644
+--- a/arch/mips/include/asm/ptrace.h
++++ b/arch/mips/include/asm/ptrace.h
+@@ -23,7 +23,7 @@
+ struct pt_regs {
+ #ifdef CONFIG_32BIT
+ /* Pad bytes for argument save space on the stack. */
+- unsigned long pad0[6];
++ unsigned long pad0[8];
+ #endif
+
+ /* Saved main processor registers. */
+--
+1.7.10.4
+
Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series Wed Jul 30 19:11:50 2014 (r21653)
+++ dists/sid/linux/debian/patches/series Wed Jul 30 19:12:58 2014 (r21654)
@@ -66,6 +66,7 @@
bugfix/mips/MIPS-Fix-branch-emulation-of-branch-likely-instructi.patch
bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch
bugfix/mips/MIPS-OCTEON-make-get_system_type-thread-safe.patch
+bugfix/mips/MIPS-O32-32-bit-Fix-bug-which-can-cause-incorrect-sy.patch
bugfix/s390/s390-ptrace-fix-PSW-mask-check.patch
# Miscellaneous bug fixes
More information about the Kernel-svn-changes
mailing list