]> git.itanic.dy.fi Git - linux-stable/commit
fprobe: make fprobe_kprobe_handler recursion free
authorZe Gao <zegao2021@gmail.com>
Wed, 17 May 2023 03:45:07 +0000 (11:45 +0800)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Wed, 17 May 2023 22:08:01 +0000 (07:08 +0900)
commit3cc4e2c5fbae84e5033723fb7e350bc6c164e3a2
treebdfa56f3c4aacd137f1b7e4331463574c0e54a70
parentbe243bacfb25f5219f2396d787408e8cf1301dd1
fprobe: make fprobe_kprobe_handler recursion free

Current implementation calls kprobe related functions before doing
ftrace recursion check in fprobe_kprobe_handler, which opens door
to kernel crash due to stack recursion if preempt_count_{add, sub}
is traceable in kprobe_busy_{begin, end}.

Things goes like this without this patch quoted from Steven:
"
fprobe_kprobe_handler() {
   kprobe_busy_begin() {
      preempt_disable() {
         preempt_count_add() {  <-- trace
            fprobe_kprobe_handler() {
[ wash, rinse, repeat, CRASH!!! ]
"

By refactoring the common part out of fprobe_kprobe_handler and
fprobe_handler and call ftrace recursion detection at the very beginning,
the whole fprobe_kprobe_handler is free from recursion.

[ Fix the indentation of __fprobe_handler() parameters. ]

Link: https://lore.kernel.org/all/20230517034510.15639-3-zegao@tencent.com/
Fixes: ab51e15d535e ("fprobe: Introduce FPROBE_FL_KPROBE_SHARED flag for fprobe")
Signed-off-by: Ze Gao <zegao@tencent.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
kernel/trace/fprobe.c