diff options
author | Oleg Nesterov <oleg@redhat.com> | 2012-12-31 12:12:48 -0500 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2013-02-08 11:47:12 -0500 |
commit | aba51024e7159c93914557caaa2b8cda26331091 (patch) | |
tree | 9883f94fdefa1347040be590b336e809ba6d3300 /kernel/events/uprobes.c | |
parent | a6cb3f6d51253e9cf21a38b17c025018117809d7 (diff) |
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>
Diffstat (limited to 'kernel/events/uprobes.c')
-rw-r--r-- | kernel/events/uprobes.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 8d9c5bcb110e..0527379dac5b 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c | |||
@@ -1306,6 +1306,7 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr) | |||
1306 | { | 1306 | { |
1307 | struct uprobe_task *utask; | 1307 | struct uprobe_task *utask; |
1308 | unsigned long xol_vaddr; | 1308 | unsigned long xol_vaddr; |
1309 | int err; | ||
1309 | 1310 | ||
1310 | utask = current->utask; | 1311 | utask = current->utask; |
1311 | 1312 | ||
@@ -1316,7 +1317,13 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr) | |||
1316 | utask->xol_vaddr = xol_vaddr; | 1317 | utask->xol_vaddr = xol_vaddr; |
1317 | utask->vaddr = bp_vaddr; | 1318 | utask->vaddr = bp_vaddr; |
1318 | 1319 | ||
1319 | return arch_uprobe_pre_xol(&uprobe->arch, regs); | 1320 | err = arch_uprobe_pre_xol(&uprobe->arch, regs); |
1321 | if (unlikely(err)) { | ||
1322 | xol_free_insn_slot(current); | ||
1323 | return err; | ||
1324 | } | ||
1325 | |||
1326 | return 0; | ||
1320 | } | 1327 | } |
1321 | 1328 | ||
1322 | /* | 1329 | /* |