uprobes: Fix utask->xol_vaddr leak in pre_ssout()
authorOleg Nesterov <oleg@redhat.com>
Mon, 31 Dec 2012 17:12:48 +0000 (18:12 +0100)
committerOleg Nesterov <oleg@redhat.com>
Fri, 8 Feb 2013 16:47:12 +0000 (17:47 +0100)
pre_ssout() should do xol_free_insn_slot() if arch_uprobe_pre_xol()
fails, otherwise nobody will free the allocated slot.

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

index 8d9c5bc..0527379 100644 (file)
@@ -1306,6 +1306,7 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr)
 {
        struct uprobe_task *utask;
        unsigned long xol_vaddr;
+       int err;
 
        utask = current->utask;
 
@@ -1316,7 +1317,13 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr)
        utask->xol_vaddr = xol_vaddr;
        utask->vaddr = bp_vaddr;
 
-       return arch_uprobe_pre_xol(&uprobe->arch, regs);
+       err = arch_uprobe_pre_xol(&uprobe->arch, regs);
+       if (unlikely(err)) {
+               xol_free_insn_slot(current);
+               return err;
+       }
+
+       return 0;
 }
 
 /*