]>
Commit | Line | Data |
---|---|---|
221ef3ca GKH |
1 | From 0d73c3f8e7f6ee2aab1bb350f60c180f5ae21a2c Mon Sep 17 00:00:00 2001 |
2 | From: Masami Hiramatsu <mhiramat@kernel.org> | |
3 | Date: Sun, 13 May 2018 05:04:29 +0100 | |
4 | Subject: ARM: 8772/1: kprobes: Prohibit kprobes on get_user functions | |
5 | ||
6 | From: Masami Hiramatsu <mhiramat@kernel.org> | |
7 | ||
8 | commit 0d73c3f8e7f6ee2aab1bb350f60c180f5ae21a2c upstream. | |
9 | ||
10 | Since do_undefinstr() uses get_user to get the undefined | |
11 | instruction, it can be called before kprobes processes | |
12 | recursive check. This can cause an infinit recursive | |
13 | exception. | |
14 | Prohibit probing on get_user functions. | |
15 | ||
16 | Fixes: 24ba613c9d6c ("ARM kprobes: core code") | |
17 | Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> | |
18 | Cc: stable@vger.kernel.org | |
19 | Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | |
20 | Signed-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 |