uprobes: Fix utask->xol_vaddr leak in pre_ssout()
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>
This commit is contained in:
parent
a6cb3f6d51
commit
aba51024e7
1 changed files with 8 additions and 1 deletions
|
@ -1306,6 +1306,7 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr)
|
||||||
{
|
{
|
||||||
struct uprobe_task *utask;
|
struct uprobe_task *utask;
|
||||||
unsigned long xol_vaddr;
|
unsigned long xol_vaddr;
|
||||||
|
int err;
|
||||||
|
|
||||||
utask = current->utask;
|
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->xol_vaddr = xol_vaddr;
|
||||||
utask->vaddr = bp_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue