Extract the "push return address" code from branch_emulate_op() into
the new simple helper, push_ret_address(). It will have more users.

Signed-off-by: Oleg Nesterov <o...@redhat.com>
---
 arch/x86/kernel/uprobes.c |   15 ++++++++++++---
 1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index 37e73b6..48d2623 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -407,6 +407,17 @@ static int default_pre_xol_op(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
        return 0;
 }
 
+static int push_ret_address(struct pt_regs *regs, unsigned long ip)
+{
+       unsigned long new_sp = regs->sp - sizeof_long();
+
+       if (copy_to_user((void __user *)new_sp, &ip, sizeof_long()))
+               return -EFAULT;
+
+       regs->sp = new_sp;
+       return 0;
+}
+
 /*
  * Adjust the return address pushed by a call insn executed out of line.
  */
@@ -517,7 +528,6 @@ static bool branch_emulate_op(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
        unsigned long offs = (long)auprobe->branch.offs;
 
        if (branch_is_call(auprobe)) {
-               unsigned long new_sp = regs->sp - sizeof_long();
                /*
                 * If it fails we execute this (mangled, see the comment in
                 * branch_clear_offset) insn out-of-line. In the likely case
@@ -527,9 +537,8 @@ static bool branch_emulate_op(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
                 *
                 * But there is corner case, see the comment in ->post_xol().
                 */
-               if (copy_to_user((void __user *)new_sp, &new_ip, sizeof_long()))
+               if (push_ret_address(regs, new_ip))
                        return false;
-               regs->sp = new_sp;
        } else if (!check_jmp_cond(auprobe, regs)) {
                offs = 0;
        }
-- 
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to