aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2014-08-22 09:20:24 -0400
committerWill Deacon <will.deacon@arm.com>2014-08-28 15:01:42 -0400
commit85487edd252fa04718dcd735bc0f41213bbb9546 (patch)
treeb59a5d4c9ee42f7f60c2f1f0284112fc677429e8 /arch
parent27d7ff273c2aad37b28f6ff0cab2cfa35b51e648 (diff)
arm64: ptrace: fix compat reg getter/setter return values
copy_{to,from}_user return the number of bytes remaining on failure, not an error code. This patch returns -EFAULT when the copy operation didn't complete, rather than expose the number of bytes not copied directly to userspace. Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm64/kernel/ptrace.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
index 2ac998878001..fe63ac5e9bf5 100644
--- a/arch/arm64/kernel/ptrace.c
+++ b/arch/arm64/kernel/ptrace.c
@@ -663,8 +663,10 @@ static int compat_gpr_get(struct task_struct *target,
663 kbuf += sizeof(reg); 663 kbuf += sizeof(reg);
664 } else { 664 } else {
665 ret = copy_to_user(ubuf, &reg, sizeof(reg)); 665 ret = copy_to_user(ubuf, &reg, sizeof(reg));
666 if (ret) 666 if (ret) {
667 ret = -EFAULT;
667 break; 668 break;
669 }
668 670
669 ubuf += sizeof(reg); 671 ubuf += sizeof(reg);
670 } 672 }
@@ -702,8 +704,10 @@ static int compat_gpr_set(struct task_struct *target,
702 kbuf += sizeof(reg); 704 kbuf += sizeof(reg);
703 } else { 705 } else {
704 ret = copy_from_user(&reg, ubuf, sizeof(reg)); 706 ret = copy_from_user(&reg, ubuf, sizeof(reg));
705 if (ret) 707 if (ret) {
706 return ret; 708 ret = -EFAULT;
709 break;
710 }
707 711
708 ubuf += sizeof(reg); 712 ubuf += sizeof(reg);
709 } 713 }