diff options
Diffstat (limited to 'mm/usercopy.c')
| -rw-r--r-- | mm/usercopy.c | 9 |
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); | |||
| 247 | /* | 247 | /* |
| 248 | * Validates that the given object is: | 248 | * Validates that the given object is: |
| 249 | * - not bogus address | 249 | * - not bogus address |
| 250 | * - known-safe heap or stack object | 250 | * - fully contained by stack (or stack frame, when available) |
| 251 | * - fully within SLAB object (or object whitelist area, when available) | ||
| 251 | * - not in kernel text | 252 | * - not in kernel text |
| 252 | */ | 253 | */ |
| 253 | void __check_object_size(const void *ptr, unsigned long n, bool to_user) | 254 | 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) | |||
| 262 | /* Check for invalid addresses. */ | 263 | /* Check for invalid addresses. */ |
| 263 | check_bogus_address((const unsigned long)ptr, n, to_user); | 264 | check_bogus_address((const unsigned long)ptr, n, to_user); |
| 264 | 265 | ||
| 265 | /* Check for bad heap object. */ | ||
| 266 | check_heap_object(ptr, n, to_user); | ||
| 267 | |||
| 268 | /* Check for bad stack object. */ | 266 | /* Check for bad stack object. */ |
| 269 | switch (check_stack_object(ptr, n)) { | 267 | switch (check_stack_object(ptr, n)) { |
| 270 | case NOT_STACK: | 268 | case NOT_STACK: |
| @@ -282,6 +280,9 @@ void __check_object_size(const void *ptr, unsigned long n, bool to_user) | |||
| 282 | usercopy_abort("process stack", NULL, to_user, 0, n); | 280 | usercopy_abort("process stack", NULL, to_user, 0, n); |
| 283 | } | 281 | } |
| 284 | 282 | ||
| 283 | /* Check for bad heap object. */ | ||
| 284 | check_heap_object(ptr, n, to_user); | ||
| 285 | |||
| 285 | /* Check for object in kernel to avoid text exposure. */ | 286 | /* Check for object in kernel to avoid text exposure. */ |
| 286 | check_kernel_text_object((const unsigned long)ptr, n, to_user); | 287 | check_kernel_text_object((const unsigned long)ptr, n, to_user); |
| 287 | } | 288 | } |
