diff options
Diffstat (limited to 'arch/sparc/kernel/ptrace_64.c')
| -rw-r--r-- | arch/sparc/kernel/ptrace_64.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c index aa90da08bf61..9ccc812bc09e 100644 --- a/arch/sparc/kernel/ptrace_64.c +++ b/arch/sparc/kernel/ptrace_64.c | |||
| @@ -969,16 +969,19 @@ struct fps { | |||
| 969 | unsigned long fsr; | 969 | unsigned long fsr; |
| 970 | }; | 970 | }; |
| 971 | 971 | ||
| 972 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 972 | long arch_ptrace(struct task_struct *child, long request, |
| 973 | unsigned long addr, unsigned long data) | ||
| 973 | { | 974 | { |
| 974 | const struct user_regset_view *view = task_user_regset_view(current); | 975 | const struct user_regset_view *view = task_user_regset_view(current); |
| 975 | unsigned long addr2 = task_pt_regs(current)->u_regs[UREG_I4]; | 976 | unsigned long addr2 = task_pt_regs(current)->u_regs[UREG_I4]; |
| 976 | struct pt_regs __user *pregs; | 977 | struct pt_regs __user *pregs; |
| 977 | struct fps __user *fps; | 978 | struct fps __user *fps; |
| 979 | void __user *addr2p; | ||
| 978 | int ret; | 980 | int ret; |
| 979 | 981 | ||
| 980 | pregs = (struct pt_regs __user *) (unsigned long) addr; | 982 | pregs = (struct pt_regs __user *) addr; |
| 981 | fps = (struct fps __user *) (unsigned long) addr; | 983 | fps = (struct fps __user *) addr; |
| 984 | addr2p = (void __user *) addr2; | ||
| 982 | 985 | ||
| 983 | switch (request) { | 986 | switch (request) { |
| 984 | case PTRACE_PEEKUSR: | 987 | case PTRACE_PEEKUSR: |
| @@ -1029,8 +1032,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 1029 | 1032 | ||
| 1030 | case PTRACE_READTEXT: | 1033 | case PTRACE_READTEXT: |
| 1031 | case PTRACE_READDATA: | 1034 | case PTRACE_READDATA: |
| 1032 | ret = ptrace_readdata(child, addr, | 1035 | ret = ptrace_readdata(child, addr, addr2p, data); |
| 1033 | (char __user *)addr2, data); | ||
| 1034 | if (ret == data) | 1036 | if (ret == data) |
| 1035 | ret = 0; | 1037 | ret = 0; |
| 1036 | else if (ret >= 0) | 1038 | else if (ret >= 0) |
| @@ -1039,8 +1041,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 1039 | 1041 | ||
| 1040 | case PTRACE_WRITETEXT: | 1042 | case PTRACE_WRITETEXT: |
| 1041 | case PTRACE_WRITEDATA: | 1043 | case PTRACE_WRITEDATA: |
| 1042 | ret = ptrace_writedata(child, (char __user *) addr2, | 1044 | ret = ptrace_writedata(child, addr2p, addr, data); |
| 1043 | addr, data); | ||
| 1044 | if (ret == data) | 1045 | if (ret == data) |
| 1045 | ret = 0; | 1046 | ret = 0; |
| 1046 | else if (ret >= 0) | 1047 | else if (ret >= 0) |
