]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.16.3/mips-o32-32-bit-fix-bug-which-can-cause-incorrect-system-call-restarts.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.16.3 / mips-o32-32-bit-fix-bug-which-can-cause-incorrect-system-call-restarts.patch
CommitLineData
c8fb49aa
GKH
1From e90e6fddc57055c4c6b57f92787fea1c065d440b Mon Sep 17 00:00:00 2001
2From: Alex Smith <alex.smith@imgtec.com>
3Date: Wed, 23 Jul 2014 14:40:11 +0100
4Subject: MIPS: O32/32-bit: Fix bug which can cause incorrect system call restarts
5
6From: Alex Smith <alex.smith@imgtec.com>
7
8commit e90e6fddc57055c4c6b57f92787fea1c065d440b upstream.
9
10On 32-bit/O32, pt_regs has a padding area at the beginning into which the
11syscall arguments passed via the user stack are copied. 4 arguments
12totalling 16 bytes are copied to offset 16 bytes into this area, however
13the area is only 24 bytes long. This means the last 2 arguments overwrite
14pt_regs->regs[{0,1}].
15
16If a syscall function returns an error, handle_sys stores the original
17syscall number in pt_regs->regs[0] for syscall restart. signal.c checks
18whether regs[0] is non-zero, if it is it will check whether the syscall
19return value is one of the ERESTART* codes to see if it must be
20restarted.
21
22Should a syscall be made that results in a non-zero value being copied
23off the user stack into regs[0], and then returns a positive (non-error)
24value that matches one of the ERESTART* error codes, this can be mistaken
25for requiring a syscall restart.
26
27While the possibility for this to occur has always existed, it is made
28much more likely to occur by commit 46e12c07b3b9 ("MIPS: O32 / 32-bit:
29Always copy 4 stack arguments."), since now every syscall will copy 4
30arguments and overwrite regs[0], rather than just those with 7 or 8
31arguments.
32
33Since that commit, booting Debian under a 32-bit MIPS kernel almost
34always results in a hang early in boot, due to a wait4 syscall returning
35a PID that matches one of the ERESTART* codes, which then causes an
36incorrect restart of the syscall.
37
38The problem is fixed by increasing the size of the padding area so that
39arguments copied off the stack will not overwrite pt_regs->regs[{0,1}].
40
41Signed-off-by: Alex Smith <alex.smith@imgtec.com>
42Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
43Tested-by: Aurelien Jarno <aurelien@aurel32.net>
44Cc: linux-mips@linux-mips.org
45Patchwork: https://patchwork.linux-mips.org/patch/7454/
46Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
47Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
48
49---
50 arch/mips/include/asm/ptrace.h | 2 +-
51 1 file changed, 1 insertion(+), 1 deletion(-)
52
53--- a/arch/mips/include/asm/ptrace.h
54+++ b/arch/mips/include/asm/ptrace.h
55@@ -23,7 +23,7 @@
56 struct pt_regs {
57 #ifdef CONFIG_32BIT
58 /* Pad bytes for argument save space on the stack. */
59- unsigned long pad0[6];
60+ unsigned long pad0[8];
61 #endif
62
63 /* Saved main processor registers. */