From 92c2d62a0f2fdfdeb4111787eab7eede6cfc16a3 Mon Sep 17 00:00:00 2001 From: Vasiliy Ulyanov Date: Wed, 26 Aug 2015 11:48:46 +0300 Subject: [PATCH] [IMPROVE] Implement kretprobe skipping If entry_handler returns a non-zero value we will not install probe on the return address. Change-Id: Iee2ef0ffadb85d7661b4d46ae30d88cef2d7bc0f Signed-off-by: Vyacheslav Cherkashin --- kprobe/swap_kprobes.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/kprobe/swap_kprobes.c b/kprobe/swap_kprobes.c index ece1f7f..1a08278 100644 --- a/kprobe/swap_kprobes.c +++ b/kprobe/swap_kprobes.c @@ -686,15 +686,21 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs) /* TODO: test - remove retprobe after func entry but before its exit */ ri = get_free_rp_inst(rp); if (ri != NULL) { + int skip = 0; + ri->rp = rp; ri->task = current; if (rp->entry_handler) - rp->entry_handler(ri, regs); - - swap_arch_prepare_kretprobe(ri, regs); + skip = rp->entry_handler(ri, regs); - add_rp_inst(ri); + if (skip) { + add_rp_inst(ri); + recycle_rp_inst(ri); + } else { + swap_arch_prepare_kretprobe(ri, regs); + add_rp_inst(ri); + } } else { ++rp->nmissed; } -- 2.7.4