On 08/01, Jiri Olsa wrote: > > If uprobe handler changes instruction pointer we still execute single > step) or emulate the original instruction and increment the (new) ip > with its length.
Yes... but what if we there are multiple consumers? The 1st one changes instruction_pointer, the next is unaware. Or it may change regs->ip too... Oleg. > This makes the new instruction pointer bogus and application will > likely crash on illegal instruction execution. > > If user decided to take execution elsewhere, it makes little sense > to execute the original instruction, so let's skip it. > > Signed-off-by: Jiri Olsa <jo...@kernel.org> > --- > kernel/events/uprobes.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index 4c965ba77f9f..dff5509cde67 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -2742,6 +2742,9 @@ static void handle_swbp(struct pt_regs *regs) > > handler_chain(uprobe, regs); > > + if (instruction_pointer(regs) != bp_vaddr) > + goto out; > + > if (arch_uprobe_skip_sstep(&uprobe->arch, regs)) > goto out; > > -- > 2.50.1 >