uprobes: Do not leak UTASK_BP_HIT if find_active_uprobe() fails
authorOleg Nesterov <oleg@redhat.com>
Fri, 14 Sep 2012 16:03:59 +0000 (18:03 +0200)
committerOleg Nesterov <oleg@redhat.com>
Sat, 29 Sep 2012 19:21:52 +0000 (21:21 +0200)
If handle_swbp()->find_active_uprobe() fails we return with
utask->state = UTASK_BP_HIT.

Change handle_swbp() to reset utask->state at the start. Note
that we do this unconditionally, see the next patch(es).

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
kernel/events/uprobes.c

index 912ef48d28ab485d2948b46d6862fbed91be84b5..2c1ff05af6f55fffaa0c0b95c38701c47017fd32 100644 (file)
@@ -1468,6 +1468,10 @@ static void handle_swbp(struct pt_regs *regs)
        bp_vaddr = uprobe_get_swbp_addr(regs);
        uprobe = find_active_uprobe(bp_vaddr, &is_swbp);
 
+       utask = current->utask;
+       if (utask)
+               utask->state = UTASK_RUNNING;
+
        if (!uprobe) {
                if (is_swbp > 0) {
                        /* No matching uprobe; signal SIGTRAP. */
@@ -1486,7 +1490,6 @@ static void handle_swbp(struct pt_regs *regs)
                return;
        }
 
-       utask = current->utask;
        if (!utask) {
                utask = add_utask();
                /* Cannot allocate; re-execute the instruction. */