diff options
author | Will Deacon <will.deacon@arm.com> | 2014-08-22 09:20:24 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2014-08-28 15:01:42 -0400 |
commit | 85487edd252fa04718dcd735bc0f41213bbb9546 (patch) | |
tree | b59a5d4c9ee42f7f60c2f1f0284112fc677429e8 /arch | |
parent | 27d7ff273c2aad37b28f6ff0cab2cfa35b51e648 (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.c | 10 |
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, ®, sizeof(reg)); | 665 | ret = copy_to_user(ubuf, ®, 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(®, ubuf, sizeof(reg)); | 706 | ret = copy_from_user(®, 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 | } |