aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mm/usercopy.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-01-15 15:37:46 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-01-15 15:37:46 +0100
commitcb7edfd4cd47ed50ea618b660ee283a2d99edff2 (patch)
treefb2749afac5055798dcf8f0dca77c88e749307da /mm/usercopy.c
parentUSB: core: urb: Use struct_size() in kmalloc() (diff)
parentLinux 5.0-rc2 (diff)
downloadwireguard-linux-cb7edfd4cd47ed50ea618b660ee283a2d99edff2.tar.xz
wireguard-linux-cb7edfd4cd47ed50ea618b660ee283a2d99edff2.zip
Merge 5.0-rc2 into usb-next
We need the USB fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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);
}