From: Stephen Boyd Date: Wed, 3 Aug 2011 00:52:57 +0000 (+1000) Subject: Strict user copy checks are only really supported on x86_32 even though X-Git-Tag: next-20110824~2^2~28 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=49ca34201dab8014e246ada6fc8ea41f50363cae;p=karo-tx-linux.git Strict user copy checks are only really supported on x86_32 even though the config option is selectable on x86_64. Add the necessary support to the 64 bit code to trigger copy_from_user() warnings at compile time. Signed-off-by: Stephen Boyd Acked-by: Ingo Molnar Acked-by: H. Peter Anvin Signed-off-by: Andrew Morton --- diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 1c66d30971ad..6ca53e507777 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h @@ -43,6 +43,14 @@ _copy_from_user(void *to, const void __user *from, unsigned len); __must_check unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len); +extern void copy_from_user_overflow(void) +#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS + __compiletime_error("copy_from_user() buffer size is not provably correct") +#else + __compiletime_warning("copy_from_user() buffer size is not provably correct") +#endif +; + static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) @@ -52,10 +60,8 @@ static inline unsigned long __must_check copy_from_user(void *to, might_fault(); if (likely(sz == -1 || sz >= n)) n = _copy_from_user(to, from, n); -#ifdef CONFIG_DEBUG_VM else - WARN(1, "Buffer overflow detected!\n"); -#endif + copy_from_user_overflow(); return n; } diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c index b7c2849ffb66..d7a5d9ac5479 100644 --- a/arch/x86/lib/usercopy_64.c +++ b/arch/x86/lib/usercopy_64.c @@ -181,3 +181,9 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) break; return len; } + +void copy_from_user_overflow(void) +{ + WARN(1, "Buffer overflow detected!\n"); +} +EXPORT_SYMBOL(copy_from_user_overflow);