diff options
author | Roland McGrath <roland@redhat.com> | 2007-09-24 19:50:52 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-10-02 21:48:43 -0400 |
commit | fabca2c0a461bd82a35194e3a4bb1e98f3ffa789 (patch) | |
tree | 298cc7b2c3cbfa82388b0b04c89882d6911d4a01 /arch/powerpc/kernel/ptrace.c | |
parent | fec6047047fda307e47b9e87697144a89528c752 (diff) |
[POWERPC] Add CHECK_FULL_REGS in several places in ptrace code
This restores the CHECK_FULL_REGS sanity check to every place that can
access the nonvolatile GPRs for ptrace. This is already done for
native-bitwidth PTRACE_PEEKUSR, but was omitted for many other cases
(32-bit ptrace, PTRACE_GETREGS, etc.); I think there may have been more
uniform checks before that were lost in the recent cleanup of GETREGS et al.
Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
-rw-r--r-- | arch/powerpc/kernel/ptrace.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index fb8866e0e35d..cf7732cdd6c7 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -331,6 +331,7 @@ static long arch_ptrace_old(struct task_struct *child, long request, long addr, | |||
331 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; | 331 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; |
332 | unsigned long __user *tmp = (unsigned long __user *)addr; | 332 | unsigned long __user *tmp = (unsigned long __user *)addr; |
333 | 333 | ||
334 | CHECK_FULL_REGS(child->thread.regs); | ||
334 | for (i = 0; i < 32; i++) { | 335 | for (i = 0; i < 32; i++) { |
335 | ret = put_user(*reg, tmp); | 336 | ret = put_user(*reg, tmp); |
336 | if (ret) | 337 | if (ret) |
@@ -346,6 +347,7 @@ static long arch_ptrace_old(struct task_struct *child, long request, long addr, | |||
346 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; | 347 | unsigned long *reg = &((unsigned long *)child->thread.regs)[0]; |
347 | unsigned long __user *tmp = (unsigned long __user *)addr; | 348 | unsigned long __user *tmp = (unsigned long __user *)addr; |
348 | 349 | ||
350 | CHECK_FULL_REGS(child->thread.regs); | ||
349 | for (i = 0; i < 32; i++) { | 351 | for (i = 0; i < 32; i++) { |
350 | ret = get_user(*reg, tmp); | 352 | ret = get_user(*reg, tmp); |
351 | if (ret) | 353 | if (ret) |
@@ -517,6 +519,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
517 | ret = -EIO; | 519 | ret = -EIO; |
518 | break; | 520 | break; |
519 | } | 521 | } |
522 | CHECK_FULL_REGS(child->thread.regs); | ||
520 | ret = 0; | 523 | ret = 0; |
521 | for (ui = 0; ui < PT_REGS_COUNT; ui ++) { | 524 | for (ui = 0; ui < PT_REGS_COUNT; ui ++) { |
522 | ret |= __put_user(ptrace_get_reg(child, ui), | 525 | ret |= __put_user(ptrace_get_reg(child, ui), |
@@ -537,6 +540,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
537 | ret = -EIO; | 540 | ret = -EIO; |
538 | break; | 541 | break; |
539 | } | 542 | } |
543 | CHECK_FULL_REGS(child->thread.regs); | ||
540 | ret = 0; | 544 | ret = 0; |
541 | for (ui = 0; ui < PT_REGS_COUNT; ui ++) { | 545 | for (ui = 0; ui < PT_REGS_COUNT; ui ++) { |
542 | ret = __get_user(tmp, (unsigned long __user *) data); | 546 | ret = __get_user(tmp, (unsigned long __user *) data); |