summaryrefslogtreecommitdiff
path: root/mm/usercopy.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2019-01-29 12:04:54 +0000
committerMark Brown <broonie@kernel.org>2019-01-29 12:04:54 +0000
commitd7c26e63cf78fef01d66ae848184c6ee5f4b8bbf (patch)
tree3765745a38a7ae1a4a3a056dfc6c736e4c99271d /mm/usercopy.c
parenta8233b6c1972e1959cf84a021aeb61ddcd23cc26 (diff)
parentf17b5f06cb92ef2250513a1e154c47b78df07d40 (diff)
Merge tag 'v5.0-rc4' into asoc-5.1
Linux 5.0-rc4
Diffstat (limited to 'mm/usercopy.c')
-rw-r--r--mm/usercopy.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/mm/usercopy.c b/mm/usercopy.c
index 852eb4e53f06..14faadcedd06 100644
--- a/mm/usercopy.c
+++ b/mm/usercopy.c
@@ -247,7 +247,8 @@ static DEFINE_STATIC_KEY_FALSE_RO(bypass_usercopy_checks);
/*
* Validates that the given object is:
* - not bogus address
- * - known-safe heap or stack object
+ * - fully contained by stack (or stack frame, when available)
+ * - fully within SLAB object (or object whitelist area, when available)
* - not in kernel text
*/
void __check_object_size(const void *ptr, unsigned long n, bool to_user)
@@ -262,9 +263,6 @@ void __check_object_size(const void *ptr, unsigned long n, bool to_user)
/* Check for invalid addresses. */
check_bogus_address((const unsigned long)ptr, n, to_user);
- /* Check for bad heap object. */
- check_heap_object(ptr, n, to_user);
-
/* Check for bad stack object. */
switch (check_stack_object(ptr, n)) {
case NOT_STACK:
@@ -282,6 +280,9 @@ void __check_object_size(const void *ptr, unsigned long n, bool to_user)
usercopy_abort("process stack", NULL, to_user, 0, n);
}
+ /* Check for bad heap object. */
+ check_heap_object(ptr, n, to_user);
+
/* Check for object in kernel to avoid text exposure. */
check_kernel_text_object((const unsigned long)ptr, n, to_user);
}