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: 24ba613c9d
("ARM kprobes: core code")
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
This commit is contained in:

committed by
Russell King

parent
eb0146daef
commit
0d73c3f8e7
@@ -536,4 +536,14 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
|
#define _ASM_NOKPROBE(entry) \
|
||||||
|
.pushsection "_kprobe_blacklist", "aw" ; \
|
||||||
|
.balign 4 ; \
|
||||||
|
.long entry; \
|
||||||
|
.popsection
|
||||||
|
#else
|
||||||
|
#define _ASM_NOKPROBE(entry)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_ASSEMBLER_H__ */
|
#endif /* __ASM_ASSEMBLER_H__ */
|
||||||
|
@@ -38,6 +38,7 @@ ENTRY(__get_user_1)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_1)
|
ENDPROC(__get_user_1)
|
||||||
|
_ASM_NOKPROBE(__get_user_1)
|
||||||
|
|
||||||
ENTRY(__get_user_2)
|
ENTRY(__get_user_2)
|
||||||
check_uaccess r0, 2, r1, r2, __get_user_bad
|
check_uaccess r0, 2, r1, r2, __get_user_bad
|
||||||
@@ -58,6 +59,7 @@ rb .req r0
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_2)
|
ENDPROC(__get_user_2)
|
||||||
|
_ASM_NOKPROBE(__get_user_2)
|
||||||
|
|
||||||
ENTRY(__get_user_4)
|
ENTRY(__get_user_4)
|
||||||
check_uaccess r0, 4, r1, r2, __get_user_bad
|
check_uaccess r0, 4, r1, r2, __get_user_bad
|
||||||
@@ -65,6 +67,7 @@ ENTRY(__get_user_4)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_4)
|
ENDPROC(__get_user_4)
|
||||||
|
_ASM_NOKPROBE(__get_user_4)
|
||||||
|
|
||||||
ENTRY(__get_user_8)
|
ENTRY(__get_user_8)
|
||||||
check_uaccess r0, 8, r1, r2, __get_user_bad8
|
check_uaccess r0, 8, r1, r2, __get_user_bad8
|
||||||
@@ -78,6 +81,7 @@ ENTRY(__get_user_8)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_8)
|
ENDPROC(__get_user_8)
|
||||||
|
_ASM_NOKPROBE(__get_user_8)
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
ENTRY(__get_user_32t_8)
|
ENTRY(__get_user_32t_8)
|
||||||
@@ -91,6 +95,7 @@ ENTRY(__get_user_32t_8)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_32t_8)
|
ENDPROC(__get_user_32t_8)
|
||||||
|
_ASM_NOKPROBE(__get_user_32t_8)
|
||||||
|
|
||||||
ENTRY(__get_user_64t_1)
|
ENTRY(__get_user_64t_1)
|
||||||
check_uaccess r0, 1, r1, r2, __get_user_bad8
|
check_uaccess r0, 1, r1, r2, __get_user_bad8
|
||||||
@@ -98,6 +103,7 @@ ENTRY(__get_user_64t_1)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_64t_1)
|
ENDPROC(__get_user_64t_1)
|
||||||
|
_ASM_NOKPROBE(__get_user_64t_1)
|
||||||
|
|
||||||
ENTRY(__get_user_64t_2)
|
ENTRY(__get_user_64t_2)
|
||||||
check_uaccess r0, 2, r1, r2, __get_user_bad8
|
check_uaccess r0, 2, r1, r2, __get_user_bad8
|
||||||
@@ -114,6 +120,7 @@ rb .req r0
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_64t_2)
|
ENDPROC(__get_user_64t_2)
|
||||||
|
_ASM_NOKPROBE(__get_user_64t_2)
|
||||||
|
|
||||||
ENTRY(__get_user_64t_4)
|
ENTRY(__get_user_64t_4)
|
||||||
check_uaccess r0, 4, r1, r2, __get_user_bad8
|
check_uaccess r0, 4, r1, r2, __get_user_bad8
|
||||||
@@ -121,6 +128,7 @@ ENTRY(__get_user_64t_4)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_64t_4)
|
ENDPROC(__get_user_64t_4)
|
||||||
|
_ASM_NOKPROBE(__get_user_64t_4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__get_user_bad8:
|
__get_user_bad8:
|
||||||
@@ -131,6 +139,8 @@ __get_user_bad:
|
|||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_bad)
|
ENDPROC(__get_user_bad)
|
||||||
ENDPROC(__get_user_bad8)
|
ENDPROC(__get_user_bad8)
|
||||||
|
_ASM_NOKPROBE(__get_user_bad)
|
||||||
|
_ASM_NOKPROBE(__get_user_bad8)
|
||||||
|
|
||||||
.pushsection __ex_table, "a"
|
.pushsection __ex_table, "a"
|
||||||
.long 1b, __get_user_bad
|
.long 1b, __get_user_bad
|
||||||
|
Reference in New Issue
Block a user