summaryrefslogtreecommitdiffstats
path: root/mm/usercopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/usercopy.c')
-rw-r--r--mm/usercopy.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/mm/usercopy.c b/mm/usercopy.c
index a562dd094ace..e9e9325f7638 100644
--- a/mm/usercopy.c
+++ b/mm/usercopy.c
@@ -59,13 +59,28 @@ static noinline int check_stack_object(const void *obj, unsigned long len)
59} 59}
60 60
61/* 61/*
62 * If this function is reached, then CONFIG_HARDENED_USERCOPY has found an 62 * If these functions are reached, then CONFIG_HARDENED_USERCOPY has found
63 * unexpected state during a copy_from_user() or copy_to_user() call. 63 * an unexpected state during a copy_from_user() or copy_to_user() call.
64 * There are several checks being performed on the buffer by the 64 * There are several checks being performed on the buffer by the
65 * __check_object_size() function. Normal stack buffer usage should never 65 * __check_object_size() function. Normal stack buffer usage should never
66 * trip the checks, and kernel text addressing will always trip the check. 66 * trip the checks, and kernel text addressing will always trip the check.
67 * For cache objects, copies must be within the object size. 67 * For cache objects, it is checking that only the whitelisted range of
68 * bytes for a given cache is being accessed (via the cache's usersize and
69 * useroffset fields). To adjust a cache whitelist, use the usercopy-aware
70 * kmem_cache_create_usercopy() function to create the cache (and
71 * carefully audit the whitelist range).
68 */ 72 */
73void usercopy_warn(const char *name, const char *detail, bool to_user,
74 unsigned long offset, unsigned long len)
75{
76 WARN_ONCE(1, "Bad or missing usercopy whitelist? Kernel memory %s attempt detected %s %s%s%s%s (offset %lu, size %lu)!\n",
77 to_user ? "exposure" : "overwrite",
78 to_user ? "from" : "to",
79 name ? : "unknown?!",
80 detail ? " '" : "", detail ? : "", detail ? "'" : "",
81 offset, len);
82}
83
69void __noreturn usercopy_abort(const char *name, const char *detail, 84void __noreturn usercopy_abort(const char *name, const char *detail,
70 bool to_user, unsigned long offset, 85 bool to_user, unsigned long offset,
71 unsigned long len) 86 unsigned long len)