]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.4.133/arm-8772-1-kprobes-prohibit-kprobes-on-get_user-functions.patch
Fixes for 5.10
[thirdparty/kernel/stable-queue.git] / releases / 4.4.133 / arm-8772-1-kprobes-prohibit-kprobes-on-get_user-functions.patch
CommitLineData
221ef3ca
GKH
1From 0d73c3f8e7f6ee2aab1bb350f60c180f5ae21a2c Mon Sep 17 00:00:00 2001
2From: Masami Hiramatsu <mhiramat@kernel.org>
3Date: Sun, 13 May 2018 05:04:29 +0100
4Subject: ARM: 8772/1: kprobes: Prohibit kprobes on get_user functions
5
6From: Masami Hiramatsu <mhiramat@kernel.org>
7
8commit 0d73c3f8e7f6ee2aab1bb350f60c180f5ae21a2c upstream.
9
10Since do_undefinstr() uses get_user to get the undefined
11instruction, it can be called before kprobes processes
12recursive check. This can cause an infinit recursive
13exception.
14Prohibit probing on get_user functions.
15
16Fixes: 24ba613c9d6c ("ARM kprobes: core code")
17Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
18Cc: stable@vger.kernel.org
19Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
20Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
21
22---
23 arch/arm/include/asm/assembler.h | 10 ++++++++++
24 arch/arm/lib/getuser.S | 10 ++++++++++
25 2 files changed, 20 insertions(+)
26
27--- a/arch/arm/include/asm/assembler.h
28+++ b/arch/arm/include/asm/assembler.h
29@@ -530,4 +530,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
30 #endif
31 .endm
32
33+#ifdef CONFIG_KPROBES
34+#define _ASM_NOKPROBE(entry) \
35+ .pushsection "_kprobe_blacklist", "aw" ; \
36+ .balign 4 ; \
37+ .long entry; \
38+ .popsection
39+#else
40+#define _ASM_NOKPROBE(entry)
41+#endif
42+
43 #endif /* __ASM_ASSEMBLER_H__ */
44--- a/arch/arm/lib/getuser.S
45+++ b/arch/arm/lib/getuser.S
46@@ -38,6 +38,7 @@ ENTRY(__get_user_1)
47 mov r0, #0
48 ret lr
49 ENDPROC(__get_user_1)
50+_ASM_NOKPROBE(__get_user_1)
51
52 ENTRY(__get_user_2)
53 check_uaccess r0, 2, r1, r2, __get_user_bad
54@@ -58,6 +59,7 @@ rb .req r0
55 mov r0, #0
56 ret lr
57 ENDPROC(__get_user_2)
58+_ASM_NOKPROBE(__get_user_2)
59
60 ENTRY(__get_user_4)
61 check_uaccess r0, 4, r1, r2, __get_user_bad
62@@ -65,6 +67,7 @@ ENTRY(__get_user_4)
63 mov r0, #0
64 ret lr
65 ENDPROC(__get_user_4)
66+_ASM_NOKPROBE(__get_user_4)
67
68 ENTRY(__get_user_8)
69 check_uaccess r0, 8, r1, r2, __get_user_bad8
70@@ -78,6 +81,7 @@ ENTRY(__get_user_8)
71 mov r0, #0
72 ret lr
73 ENDPROC(__get_user_8)
74+_ASM_NOKPROBE(__get_user_8)
75
76 #ifdef __ARMEB__
77 ENTRY(__get_user_32t_8)
78@@ -91,6 +95,7 @@ ENTRY(__get_user_32t_8)
79 mov r0, #0
80 ret lr
81 ENDPROC(__get_user_32t_8)
82+_ASM_NOKPROBE(__get_user_32t_8)
83
84 ENTRY(__get_user_64t_1)
85 check_uaccess r0, 1, r1, r2, __get_user_bad8
86@@ -98,6 +103,7 @@ ENTRY(__get_user_64t_1)
87 mov r0, #0
88 ret lr
89 ENDPROC(__get_user_64t_1)
90+_ASM_NOKPROBE(__get_user_64t_1)
91
92 ENTRY(__get_user_64t_2)
93 check_uaccess r0, 2, r1, r2, __get_user_bad8
94@@ -114,6 +120,7 @@ rb .req r0
95 mov r0, #0
96 ret lr
97 ENDPROC(__get_user_64t_2)
98+_ASM_NOKPROBE(__get_user_64t_2)
99
100 ENTRY(__get_user_64t_4)
101 check_uaccess r0, 4, r1, r2, __get_user_bad8
102@@ -121,6 +128,7 @@ ENTRY(__get_user_64t_4)
103 mov r0, #0
104 ret lr
105 ENDPROC(__get_user_64t_4)
106+_ASM_NOKPROBE(__get_user_64t_4)
107 #endif
108
109 __get_user_bad8:
110@@ -131,6 +139,8 @@ __get_user_bad:
111 ret lr
112 ENDPROC(__get_user_bad)
113 ENDPROC(__get_user_bad8)
114+_ASM_NOKPROBE(__get_user_bad)
115+_ASM_NOKPROBE(__get_user_bad8)
116
117 .pushsection __ex_table, "a"
118 .long 1b, __get_user_bad