Messages in this thread | | | Date | Wed, 15 Jun 2022 09:34:24 +0900 | From | Masami Hiramatsu (Google) <> | Subject | Re: [PATCH] kprobes: Rollback post_handler on failed arm_kprobe() |
| |
Hi Chuang,
On Tue, 14 Jun 2022 17:06:33 +0800 Chuang W <nashuiliang@gmail.com> wrote:
> In a scenario where livepatch and aggrprobe coexist, if arm_kprobe() > returns an error, ap.post_handler, while has been modified to > p.post_handler, is not rolled back.
Would you mean 'coexist' on the same function?
> > When ap.post_handler is not NULL (not rolled back), the caller (e.g. > register_kprobe/enable_kprobe) of arm_kprobe_ftrace() will always fail.
It seems this explanation and the actual code does not match. Can you tell me what actually you observed?
Thank you,
> > Fixes: 12310e343755 ("kprobes: Propagate error from arm_kprobe_ftrace()") > Signed-off-by: Chuang W <nashuiliang@gmail.com> > Cc: <stable@vger.kernel.org> > --- > kernel/kprobes.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > index f214f8c088ed..0610b02a3a05 100644 > --- a/kernel/kprobes.c > +++ b/kernel/kprobes.c > @@ -1300,6 +1300,7 @@ static int register_aggr_kprobe(struct kprobe *orig_p, struct kprobe *p) > { > int ret = 0; > struct kprobe *ap = orig_p; > + kprobe_post_handler_t old_post_handler = NULL; > > cpus_read_lock(); > > @@ -1351,6 +1352,9 @@ static int register_aggr_kprobe(struct kprobe *orig_p, struct kprobe *p) > > /* Copy the insn slot of 'p' to 'ap'. */ > copy_kprobe(ap, p); > + > + /* save the old post_handler */ > + old_post_handler = ap->post_handler; > ret = add_new_kprobe(ap, p); > > out: > @@ -1365,6 +1369,7 @@ static int register_aggr_kprobe(struct kprobe *orig_p, struct kprobe *p) > ret = arm_kprobe(ap); > if (ret) { > ap->flags |= KPROBE_FLAG_DISABLED; > + ap->post_handler = old_post_handler; > list_del_rcu(&p->list); > synchronize_rcu(); > } > -- > 2.34.1 >
-- Masami Hiramatsu (Google) <mhiramat@kernel.org>
| |