summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2012-09-14 18:23:51 +0200
committerOleg Nesterov <oleg@redhat.com>2012-09-29 21:21:52 +0200
commit746a9e6ba24af2ccf03279c99d435a1b88ca5d17 (patch)
tree7ee4399b90c952520c492fea64cb2d841341d0d4
parentuprobes: Do not leak UTASK_BP_HIT if find_active_uprobe() fails (diff)
downloadlinux-746a9e6ba24af2ccf03279c99d435a1b88ca5d17.tar.xz
linux-746a9e6ba24af2ccf03279c99d435a1b88ca5d17.zip
uprobes: Do not setup ->active_uprobe/state prematurely
handle_swbp() sets utask->active_uprobe before handler_chain(), and UTASK_SSTEP before pre_ssout(). This complicates the code for no reason, arch_ hooks or consumer->handler() should not (and can't) use this info. Change handle_swbp() to initialize them after pre_ssout(), and remove the no longer needed cleanup-utask code. Signed-off-by: Oleg Nesterov <oleg@redhat.com> cked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
-rw-r--r--kernel/events/uprobes.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 2c1ff05af6f5..41f048c91425 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -1496,22 +1496,19 @@ static void handle_swbp(struct pt_regs *regs)
if (!utask)
goto cleanup_ret;
}
- utask->active_uprobe = uprobe;
+
handler_chain(uprobe, regs);
if (uprobe->flags & UPROBE_SKIP_SSTEP && can_skip_sstep(uprobe, regs))
goto cleanup_ret;
- utask->state = UTASK_SSTEP;
if (!pre_ssout(uprobe, regs, bp_vaddr)) {
arch_uprobe_enable_step(&uprobe->arch);
+ utask->active_uprobe = uprobe;
+ utask->state = UTASK_SSTEP;
return;
}
cleanup_ret:
- if (utask) {
- utask->active_uprobe = NULL;
- utask->state = UTASK_RUNNING;
- }
if (!(uprobe->flags & UPROBE_SKIP_SSTEP))
/*