x86: Add a Kconfig option to turn the copy_from_user warnings into errors
authorArjan van de Ven <arjan@infradead.org>
Fri, 2 Oct 2009 14:50:50 +0000 (07:50 -0700)
committerIngo Molnar <mingo@elte.hu>
Fri, 2 Oct 2009 17:01:42 +0000 (19:01 +0200)
For automated testing it is useful to have the option to turn
the warnings on copy_from_user() etc checks into errors:

 In function ‘copy_from_user’,
     inlined from ‘fd_copyin’ at drivers/block/floppy.c:3080,
     inlined from ‘fd_ioctl’ at drivers/block/floppy.c:3503:
   linux/arch/x86/include/asm/uaccess_32.h:213:
  error: call to ‘copy_from_user_overflow’ declared with attribute error:
  copy_from_user buffer size is not provably correct

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <20091002075050.4e9f7641@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/Kconfig.debug
arch/x86/include/asm/uaccess_32.h
include/linux/compiler-gcc4.h
include/linux/compiler.h

index d105f29bb6bb7c9b75fe3369d66f68f2f3ada5ba..1bd2e36f1538828e3ab98b25bad4a72c5c8a6ad5 100644 (file)
@@ -287,4 +287,18 @@ config OPTIMIZE_INLINING
 
          If unsure, say N.
 
+config DEBUG_STRICT_USER_COPY_CHECKS
+       bool "Strict copy size checks"
+       depends on DEBUG_KERNEL
+       ---help---
+         Enabling this option turns a certain set of sanity checks for user
+         copy operations into compile time failures.
+
+         The copy_from_user() etc checks are there to help test if there
+         are sufficient security checks on the length argument of
+         the copy operation, by having gcc prove that the argument is
+         within bounds.
+
+         If unsure, or if you run an older (pre 4.4) gcc, say N.
+
 endmenu
index 952f9e793c3e011580069563016ca6eb958cc8ac..0c9825e97f361fd40032ac8d3417318288a864b2 100644 (file)
@@ -193,7 +193,9 @@ unsigned long __must_check _copy_from_user(void *to,
 
 
 extern void copy_from_user_overflow(void)
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
+#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
 ;
index f1709c1f9eae99ea57f0c9b42d4f5dd149fcb169..77542c57e20a4d03d7d916c3ffaa1395701d6dc6 100644 (file)
@@ -41,4 +41,5 @@
 #define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
 #if __GNUC_MINOR__ >= 4
 #define __compiletime_warning(message) __attribute__((warning(message)))
+#define __compiletime_error(message) __attribute__((error(message)))
 #endif
index 950356311f12d28207cb1df798c9e856fd3144a4..88fd4b673cb499fead4504aae5f3dfe662671951 100644 (file)
@@ -273,6 +273,9 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
 #ifndef __compiletime_warning
 # define __compiletime_warning(message)
 #endif
+#ifndef __compiletime_error
+# define __compiletime_error(message)
+#endif
 
 /*
  * Prevent the compiler from merging or refetching accesses.  The compiler