Loading arch/sparc/kernel/ptrace_64.c +16 −43 Original line number Diff line number Diff line Loading @@ -518,10 +518,10 @@ static int genregs32_get(struct task_struct *target, void *kbuf, void __user *ubuf) { const struct pt_regs *regs = task_pt_regs(target); compat_ulong_t __user *reg_window; compat_ulong_t *k = kbuf; compat_ulong_t __user *u = ubuf; compat_ulong_t reg; u32 uregs[16]; u32 reg; if (target == current) flushw_user(); Loading @@ -533,52 +533,25 @@ static int genregs32_get(struct task_struct *target, for (; count > 0 && pos < 16; count--) *k++ = regs->u_regs[pos++]; reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6]; reg_window -= 16; if (target == current) { for (; count > 0 && pos < 32; count--) { if (get_user(*k++, ®_window[pos++])) return -EFAULT; } } else { for (; count > 0 && pos < 32; count--) { if (access_process_vm(target, (unsigned long) ®_window[pos], k, sizeof(*k), FOLL_FORCE) != sizeof(*k)) if (count && pos < 32) { if (get_from_target(target, regs->u_regs[UREG_I6], uregs, sizeof(uregs))) return -EFAULT; k++; pos++; } for (; count > 0 && pos < 32; count--) *k++ = uregs[pos++ - 16]; } } else { for (; count > 0 && pos < 16; count--) { for (; count > 0 && pos < 16; count--) if (put_user((compat_ulong_t) regs->u_regs[pos++], u++)) return -EFAULT; } reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6]; reg_window -= 16; if (target == current) { for (; count > 0 && pos < 32; count--) { if (get_user(reg, ®_window[pos++]) || put_user(reg, u++)) if (count && pos < 32) { if (get_from_target(target, regs->u_regs[UREG_I6], uregs, sizeof(uregs))) return -EFAULT; } } else { for (; count > 0 && pos < 32; count--) { if (access_process_vm(target, (unsigned long) ®_window[pos++], ®, sizeof(reg), FOLL_FORCE) != sizeof(reg)) for (; count > 0 && pos < 32; count--) if (put_user(uregs[pos++ - 16], u++)) return -EFAULT; if (put_user(reg, u++)) return -EFAULT; } } } while (count > 0) { Loading Loading
arch/sparc/kernel/ptrace_64.c +16 −43 Original line number Diff line number Diff line Loading @@ -518,10 +518,10 @@ static int genregs32_get(struct task_struct *target, void *kbuf, void __user *ubuf) { const struct pt_regs *regs = task_pt_regs(target); compat_ulong_t __user *reg_window; compat_ulong_t *k = kbuf; compat_ulong_t __user *u = ubuf; compat_ulong_t reg; u32 uregs[16]; u32 reg; if (target == current) flushw_user(); Loading @@ -533,52 +533,25 @@ static int genregs32_get(struct task_struct *target, for (; count > 0 && pos < 16; count--) *k++ = regs->u_regs[pos++]; reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6]; reg_window -= 16; if (target == current) { for (; count > 0 && pos < 32; count--) { if (get_user(*k++, ®_window[pos++])) return -EFAULT; } } else { for (; count > 0 && pos < 32; count--) { if (access_process_vm(target, (unsigned long) ®_window[pos], k, sizeof(*k), FOLL_FORCE) != sizeof(*k)) if (count && pos < 32) { if (get_from_target(target, regs->u_regs[UREG_I6], uregs, sizeof(uregs))) return -EFAULT; k++; pos++; } for (; count > 0 && pos < 32; count--) *k++ = uregs[pos++ - 16]; } } else { for (; count > 0 && pos < 16; count--) { for (; count > 0 && pos < 16; count--) if (put_user((compat_ulong_t) regs->u_regs[pos++], u++)) return -EFAULT; } reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6]; reg_window -= 16; if (target == current) { for (; count > 0 && pos < 32; count--) { if (get_user(reg, ®_window[pos++]) || put_user(reg, u++)) if (count && pos < 32) { if (get_from_target(target, regs->u_regs[UREG_I6], uregs, sizeof(uregs))) return -EFAULT; } } else { for (; count > 0 && pos < 32; count--) { if (access_process_vm(target, (unsigned long) ®_window[pos++], ®, sizeof(reg), FOLL_FORCE) != sizeof(reg)) for (; count > 0 && pos < 32; count--) if (put_user(uregs[pos++ - 16], u++)) return -EFAULT; if (put_user(reg, u++)) return -EFAULT; } } } while (count > 0) { Loading