Skip to content

Commit 0d73c3f

Browse files
mhiramatRussell King
authored andcommitted
ARM: 8772/1: kprobes: Prohibit kprobes on get_user functions
Since do_undefinstr() uses get_user to get the undefined instruction, it can be called before kprobes processes recursive check. This can cause an infinit recursive exception. Prohibit probing on get_user functions. Fixes: 24ba613 ("ARM kprobes: core code") Signed-off-by: Masami Hiramatsu <[email protected]> Cc: [email protected] Signed-off-by: Russell King <[email protected]>
1 parent eb0146d commit 0d73c3f

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

arch/arm/include/asm/assembler.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,4 +536,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
536536
#endif
537537
.endm
538538

539+
#ifdef CONFIG_KPROBES
540+
#define _ASM_NOKPROBE(entry) \
541+
.pushsection "_kprobe_blacklist", "aw" ; \
542+
.balign 4 ; \
543+
.long entry; \
544+
.popsection
545+
#else
546+
#define _ASM_NOKPROBE(entry)
547+
#endif
548+
539549
#endif /* __ASM_ASSEMBLER_H__ */

arch/arm/lib/getuser.S

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ ENTRY(__get_user_1)
3838
mov r0, #0
3939
ret lr
4040
ENDPROC(__get_user_1)
41+
_ASM_NOKPROBE(__get_user_1)
4142

4243
ENTRY(__get_user_2)
4344
check_uaccess r0, 2, r1, r2, __get_user_bad
@@ -58,13 +59,15 @@ rb .req r0
5859
mov r0, #0
5960
ret lr
6061
ENDPROC(__get_user_2)
62+
_ASM_NOKPROBE(__get_user_2)
6163

6264
ENTRY(__get_user_4)
6365
check_uaccess r0, 4, r1, r2, __get_user_bad
6466
4: TUSER(ldr) r2, [r0]
6567
mov r0, #0
6668
ret lr
6769
ENDPROC(__get_user_4)
70+
_ASM_NOKPROBE(__get_user_4)
6871

6972
ENTRY(__get_user_8)
7073
check_uaccess r0, 8, r1, r2, __get_user_bad8
@@ -78,6 +81,7 @@ ENTRY(__get_user_8)
7881
mov r0, #0
7982
ret lr
8083
ENDPROC(__get_user_8)
84+
_ASM_NOKPROBE(__get_user_8)
8185

8286
#ifdef __ARMEB__
8387
ENTRY(__get_user_32t_8)
@@ -91,13 +95,15 @@ ENTRY(__get_user_32t_8)
9195
mov r0, #0
9296
ret lr
9397
ENDPROC(__get_user_32t_8)
98+
_ASM_NOKPROBE(__get_user_32t_8)
9499

95100
ENTRY(__get_user_64t_1)
96101
check_uaccess r0, 1, r1, r2, __get_user_bad8
97102
8: TUSER(ldrb) r3, [r0]
98103
mov r0, #0
99104
ret lr
100105
ENDPROC(__get_user_64t_1)
106+
_ASM_NOKPROBE(__get_user_64t_1)
101107

102108
ENTRY(__get_user_64t_2)
103109
check_uaccess r0, 2, r1, r2, __get_user_bad8
@@ -114,13 +120,15 @@ rb .req r0
114120
mov r0, #0
115121
ret lr
116122
ENDPROC(__get_user_64t_2)
123+
_ASM_NOKPROBE(__get_user_64t_2)
117124

118125
ENTRY(__get_user_64t_4)
119126
check_uaccess r0, 4, r1, r2, __get_user_bad8
120127
11: TUSER(ldr) r3, [r0]
121128
mov r0, #0
122129
ret lr
123130
ENDPROC(__get_user_64t_4)
131+
_ASM_NOKPROBE(__get_user_64t_4)
124132
#endif
125133

126134
__get_user_bad8:
@@ -131,6 +139,8 @@ __get_user_bad:
131139
ret lr
132140
ENDPROC(__get_user_bad)
133141
ENDPROC(__get_user_bad8)
142+
_ASM_NOKPROBE(__get_user_bad)
143+
_ASM_NOKPROBE(__get_user_bad8)
134144

135145
.pushsection __ex_table, "a"
136146
.long 1b, __get_user_bad

0 commit comments

Comments
 (0)