Commit f19e20dd authored by Li Huafei's avatar Li Huafei Committed by Pu Lehui
Browse files

kprobes: Fix check for probe enabled in kill_kprobe()

mainline inclusion
from mainline-v6.2-rc1
commit 0c76ef3f
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9MXH3

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0c76ef3f26d5

--------------------------------

In kill_kprobe(), the check whether disarm_kprobe_ftrace() needs to be
called always fails. This is because before that we set the
KPROBE_FLAG_GONE flag for kprobe so that "!kprobe_disabled(p)" is always
false.

The disarm_kprobe_ftrace() call introduced by commit:

  0cb2f137 ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler")

to fix the NULL pointer reference problem. When the probe is enabled, if
we do not disarm it, this problem still exists.

Fix it by putting the probe enabled check before setting the
KPROBE_FLAG_GONE flag.

Link: https://lore.kernel.org/all/20221126114316.201857-1-lihuafei1@huawei.com/



Fixes: 3031313e ("kprobes: Fix to check probe enabled before disarm_kprobe_ftrace()")
Signed-off-by: default avatarLi Huafei <lihuafei1@huawei.com>
Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: default avatarPu Lehui <pulehui@huawei.com>
parent 93f42c5d
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -2281,6 +2281,14 @@ static void kill_kprobe(struct kprobe *p)
	if (WARN_ON_ONCE(kprobe_gone(p)))
		return;

	/*
	 * The module is going away. We should disarm the kprobe which
	 * is using ftrace, because ftrace framework is still available at
	 * MODULE_STATE_GOING notification.
	 */
	if (kprobe_ftrace(p) && !kprobe_disabled(p) && !kprobes_all_disarmed)
		disarm_kprobe_ftrace(p);

	p->flags |= KPROBE_FLAG_GONE;
	if (kprobe_aggrprobe(p)) {
		/*
@@ -2297,14 +2305,6 @@ static void kill_kprobe(struct kprobe *p)
	 * the original probed function (which will be freed soon) any more.
	 */
	arch_remove_kprobe(p);

	/*
	 * The module is going away. We should disarm the kprobe which
	 * is using ftrace, because ftrace framework is still available at
	 * MODULE_STATE_GOING notification.
	 */
	if (kprobe_ftrace(p) && !kprobe_disabled(p) && !kprobes_all_disarmed)
		disarm_kprobe_ftrace(p);
}

/* Disable one kprobe */