Skip to content

Commit 9db9bb1

Browse files
Li Huafeismb49
Li Huafei
authored andcommitted
kprobes: Skip clearing aggrprobe's post_handler in kprobe-on-ftrace case
BugLink: https://bugs.launchpad.net/bugs/2002347 [ Upstream commit 5dd7caf ] In __unregister_kprobe_top(), if the currently unregistered probe has post_handler but other child probes of the aggrprobe do not have post_handler, the post_handler of the aggrprobe is cleared. If this is a ftrace-based probe, there is a problem. In later calls to disarm_kprobe(), we will use kprobe_ftrace_ops because post_handler is NULL. But we're armed with kprobe_ipmodify_ops. This triggers a WARN in __disarm_kprobe_ftrace() and may even cause use-after-free: Failed to disarm kprobe-ftrace at kernel_clone+0x0/0x3c0 (error -2) WARNING: CPU: 5 PID: 137 at kernel/kprobes.c:1135 __disarm_kprobe_ftrace.isra.21+0xcf/0xe0 Modules linked in: testKprobe_007(-) CPU: 5 PID: 137 Comm: rmmod Not tainted 6.1.0-rc4-dirty #18 [...] Call Trace: <TASK> __disable_kprobe+0xcd/0xe0 __unregister_kprobe_top+0x12/0x150 ? mutex_lock+0xe/0x30 unregister_kprobes.part.23+0x31/0xa0 unregister_kprobe+0x32/0x40 __x64_sys_delete_module+0x15e/0x260 ? do_user_addr_fault+0x2cd/0x6b0 do_syscall_64+0x3a/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd [...] For the kprobe-on-ftrace case, we keep the post_handler setting to identify this aggrprobe armed with kprobe_ipmodify_ops. This way we can disarm it correctly. Link: https://lore.kernel.org/all/[email protected]/ Fixes: 0bc11ed ("kprobes: Allow kprobes coexist with livepatch") Reported-by: Zhao Gongyi <[email protected]> Suggested-by: Masami Hiramatsu (Google) <[email protected]> Signed-off-by: Li Huafei <[email protected]> Acked-by: Masami Hiramatsu (Google) <[email protected]> Signed-off-by: Masami Hiramatsu (Google) <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Kamal Mostafa <[email protected]> Signed-off-by: Stefan Bader <[email protected]>
1 parent 5ee9dce commit 9db9bb1

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

kernel/kprobes.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1792,7 +1792,13 @@ static int __unregister_kprobe_top(struct kprobe *p)
17921792
if ((list_p != p) && (list_p->post_handler))
17931793
goto noclean;
17941794
}
1795-
ap->post_handler = NULL;
1795+
/*
1796+
* For the kprobe-on-ftrace case, we keep the
1797+
* post_handler setting to identify this aggrprobe
1798+
* armed with kprobe_ipmodify_ops.
1799+
*/
1800+
if (!kprobe_ftrace(ap))
1801+
ap->post_handler = NULL;
17961802
}
17971803
noclean:
17981804
/*

0 commit comments

Comments
 (0)