diff options
author | Julien Thierry <julien.thierry@arm.com> | 2018-09-11 05:15:12 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2018-10-05 05:51:15 -0400 |
commit | a1d09e074250fad24f1b993f327b18cc6812eb7a (patch) | |
tree | 92904d2fbb862da96ffdfa670f7ab1556239553f | |
parent | afaf6838f4bc896a711180b702b388b8cfa638fc (diff) |
ARM: 8797/1: spectre-v1.1: harden __copy_to_user
Sanitize user pointer given to __copy_to_user, both for standard version
and memcopy version of the user accessor.
Signed-off-by: Julien Thierry <julien.thierry@arm.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | arch/arm/lib/copy_to_user.S | 6 | ||||
-rw-r--r-- | arch/arm/lib/uaccess_with_memcpy.c | 3 |
2 files changed, 7 insertions, 2 deletions
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index caf5019d8161..970abe521197 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S | |||
@@ -94,6 +94,11 @@ | |||
94 | 94 | ||
95 | ENTRY(__copy_to_user_std) | 95 | ENTRY(__copy_to_user_std) |
96 | WEAK(arm_copy_to_user) | 96 | WEAK(arm_copy_to_user) |
97 | #ifdef CONFIG_CPU_SPECTRE | ||
98 | get_thread_info r3 | ||
99 | ldr r3, [r3, #TI_ADDR_LIMIT] | ||
100 | uaccess_mask_range_ptr r0, r2, r3, ip | ||
101 | #endif | ||
97 | 102 | ||
98 | #include "copy_template.S" | 103 | #include "copy_template.S" |
99 | 104 | ||
@@ -108,4 +113,3 @@ ENDPROC(__copy_to_user_std) | |||
108 | rsb r0, r0, r2 | 113 | rsb r0, r0, r2 |
109 | copy_abort_end | 114 | copy_abort_end |
110 | .popsection | 115 | .popsection |
111 | |||
diff --git a/arch/arm/lib/uaccess_with_memcpy.c b/arch/arm/lib/uaccess_with_memcpy.c index 9b4ed1728616..73dc7360cbdd 100644 --- a/arch/arm/lib/uaccess_with_memcpy.c +++ b/arch/arm/lib/uaccess_with_memcpy.c | |||
@@ -152,7 +152,8 @@ arm_copy_to_user(void __user *to, const void *from, unsigned long n) | |||
152 | n = __copy_to_user_std(to, from, n); | 152 | n = __copy_to_user_std(to, from, n); |
153 | uaccess_restore(ua_flags); | 153 | uaccess_restore(ua_flags); |
154 | } else { | 154 | } else { |
155 | n = __copy_to_user_memcpy(to, from, n); | 155 | n = __copy_to_user_memcpy(uaccess_mask_range_ptr(to, n), |
156 | from, n); | ||
156 | } | 157 | } |
157 | return n; | 158 | return n; |
158 | } | 159 | } |