Kconfig: consolidate CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
authorStephen Boyd <sboyd@codeaurora.org>
Tue, 30 Apr 2013 22:28:42 +0000 (15:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 1 May 2013 00:04:09 +0000 (17:04 -0700)
The help text for this config is duplicated across the x86, parisc, and
s390 Kconfig.debug files.  Arnd Bergman noted that the help text was
slightly misleading and should be fixed to state that enabling this
option isn't a problem when using pre 4.4 gcc.

To simplify the rewording, consolidate the text into lib/Kconfig.debug
and modify it there to be more explicit about when you should say N to
this config.

Also, make the text a bit more generic by stating that this option
enables compile time checks so we can cover architectures which emit
warnings vs.  ones which emit errors.  The details of how an
architecture decided to implement the checks isn't as important as the
concept of compile time checking of copy_from_user() calls.

While we're doing this, remove all the copy_from_user_overflow() code
that's duplicated many times and place it into lib/ so that any
architecture supporting this option can get the function for free.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: H. Peter Anvin <hpa@zytor.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Acked-by: Helge Deller <deller@gmx.de>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
17 files changed:
arch/parisc/Kconfig
arch/parisc/Kconfig.debug
arch/s390/Kconfig
arch/s390/Kconfig.debug
arch/s390/lib/Makefile
arch/s390/lib/usercopy.c [deleted file]
arch/sparc/lib/Makefile
arch/sparc/lib/usercopy.c [deleted file]
arch/tile/Kconfig
arch/tile/include/asm/uaccess.h
arch/tile/lib/uaccess.c
arch/x86/Kconfig
arch/x86/Kconfig.debug
arch/x86/lib/usercopy_32.c
lib/Kconfig.debug
lib/Makefile
lib/usercopy.c [new file with mode: 0644]

index 0339181bf3ac3d377db760ef93a7e74933288eee..433e75a2ee9afa2ff315bf39a97a429ebc64f6a4 100644 (file)
@@ -1,5 +1,6 @@
 config PARISC
        def_bool y
+       select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
        select HAVE_IDE
        select HAVE_OPROFILE
        select HAVE_FUNCTION_TRACER if 64BIT
index 7305ac8f7f5ba7438ac2207ada7aaeb60b419d36..bc989e522a045c17ca4514478b7cb5ef9d77fc4d 100644 (file)
@@ -12,18 +12,4 @@ config DEBUG_RODATA
          portion of the kernel code won't be covered by a TLB anymore.
          If in doubt, say "N".
 
-config DEBUG_STRICT_USER_COPY_CHECKS
-       bool "Strict copy size checks"
-       depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
-       ---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 bda6ba6f3cf52d645ad337fea070b730dc46f438..ce640aff61a1947797bf2fcc5478cd8c8ef210cc 100644 (file)
@@ -91,6 +91,7 @@ config S390
        select ARCH_INLINE_WRITE_UNLOCK_BH
        select ARCH_INLINE_WRITE_UNLOCK_IRQ
        select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
+       select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
        select ARCH_SAVE_PAGE_KEYS if HIBERNATION
        select ARCH_WANT_IPC_PARSE_VERSION
        select BUILDTIME_EXTABLE_SORT
index fc32a2df497464cf7707f6843ba55a5d60f56341..c56878e1245fb4c4e75425f6e87ddd86457d5da1 100644 (file)
@@ -17,20 +17,6 @@ config STRICT_DEVMEM
 
          If you are unsure, say Y.
 
-config DEBUG_STRICT_USER_COPY_CHECKS
-       def_bool n
-       prompt "Strict user copy size checks"
-       ---help---
-         Enabling this option turns a certain set of sanity checks for user
-         copy operations into compile time warnings.
-
-         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.
-
 config S390_PTDUMP
        bool "Export kernel pagetable layout to userspace via debugfs"
        depends on DEBUG_KERNEL
index 6ab0d0b5cec82f83ab025ace480ed5b32771602c..20b0e97a7df2e204f9a680be4d95c86e0944652d 100644 (file)
@@ -3,7 +3,6 @@
 #
 
 lib-y += delay.o string.o uaccess_std.o uaccess_pt.o
-obj-y += usercopy.o
 obj-$(CONFIG_32BIT) += div64.o qrnnd.o ucmpdi2.o mem32.o
 obj-$(CONFIG_64BIT) += mem64.o
 lib-$(CONFIG_64BIT) += uaccess_mvcos.o
diff --git a/arch/s390/lib/usercopy.c b/arch/s390/lib/usercopy.c
deleted file mode 100644 (file)
index 14b363f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <linux/module.h>
-#include <linux/bug.h>
-
-void copy_from_user_overflow(void)
-{
-       WARN(1, "Buffer overflow detected!\n");
-}
-EXPORT_SYMBOL(copy_from_user_overflow);
index 8410065f2862a4ad7a43d0ae1fc36a2e77e771e0..dbe119b63b48ba968a503ee3bd40d3dceaa8ac13 100644 (file)
@@ -45,4 +45,3 @@ obj-y                 += iomap.o
 obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o
 obj-y                 += ksyms.o
 obj-$(CONFIG_SPARC64) += PeeCeeI.o
-obj-y                 += usercopy.o
diff --git a/arch/sparc/lib/usercopy.c b/arch/sparc/lib/usercopy.c
deleted file mode 100644 (file)
index 5c4284c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/bug.h>
-
-void copy_from_user_overflow(void)
-{
-       WARN(1, "Buffer overflow detected!\n");
-}
-EXPORT_SYMBOL(copy_from_user_overflow);
index 25877aebc685fcde958145add51e09e7fcbcc341..0f712f4e1b337df294e45782285f6e512ea1734f 100644 (file)
@@ -19,6 +19,7 @@ config TILE
        select HAVE_SYSCALL_WRAPPERS if TILEGX
        select VIRT_TO_BUS
        select SYS_HYPERVISOR
+       select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select GENERIC_CLOCKEVENTS
        select MODULES_USE_ELF_RELA
@@ -114,13 +115,6 @@ config STRICT_DEVMEM
 config SMP
        def_bool y
 
-# Allow checking for compile-time determined overflow errors in
-# copy_from_user().  There are still unprovable places in the
-# generic code as of 2.6.34, so this option is not really compatible
-# with -Werror, which is more useful in general.
-config DEBUG_COPY_FROM_USER
-       def_bool n
-
 config HVC_TILE
        depends on TTY
        select HVC_DRIVER
index 9ab078a4605dd9750384b15b72b34c523b038fb5..8a082bc6bca57153efb53d69fc36068a9741f0ff 100644 (file)
@@ -395,7 +395,12 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)
        return n;
 }
 
-#ifdef CONFIG_DEBUG_COPY_FROM_USER
+#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
+/*
+ * There are still unprovable places in the generic code as of 2.6.34, so this
+ * option is not really compatible with -Werror, which is more useful in
+ * general.
+ */
 extern void copy_from_user_overflow(void)
        __compiletime_warning("copy_from_user() size is not provably correct");
 
index f8d398c9ee7f3e174b70d94648db32d7500b2e80..030abe3ee4f1da38380cd592a7405fdefd346c36 100644 (file)
@@ -22,11 +22,3 @@ int __range_ok(unsigned long addr, unsigned long size)
                 is_arch_mappable_range(addr, size));
 }
 EXPORT_SYMBOL(__range_ok);
-
-#ifdef CONFIG_DEBUG_COPY_FROM_USER
-void copy_from_user_overflow(void)
-{
-       WARN(1, "Buffer overflow detected!\n");
-}
-EXPORT_SYMBOL(copy_from_user_overflow);
-#endif
index 05b057dca4a70ba4c891c78794e9b67870fbd52b..5db2117ae28830757d88db9ad25e54c224332e50 100644 (file)
@@ -20,6 +20,7 @@ config X86_64
 ### Arch settings
 config X86
        def_bool y
+       select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
        select HAVE_AOUT if X86_32
        select HAVE_UNSTABLE_SCHED_CLOCK
        select ARCH_SUPPORTS_NUMA_BALANCING
index 16f738385dcb9c0f15c10531a3e2e9215439f8ee..c198b7e13e7bba5be02fdd04db10681bdda97337 100644 (file)
@@ -292,20 +292,6 @@ config OPTIMIZE_INLINING
 
          If unsure, say N.
 
-config DEBUG_STRICT_USER_COPY_CHECKS
-       bool "Strict copy size checks"
-       depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
-       ---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.
-
 config DEBUG_NMI_SELFTEST
        bool "NMI Selftest"
        depends on DEBUG_KERNEL && X86_LOCAL_APIC
index f0312d7464027e73f52505c892409cf0d96c9945..3eb18acd0e409e41b9e0efc669b65296e57afd8e 100644 (file)
@@ -689,9 +689,3 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)
        return n;
 }
 EXPORT_SYMBOL(_copy_from_user);
-
-void copy_from_user_overflow(void)
-{
-       WARN(1, "Buffer overflow detected!\n");
-}
-EXPORT_SYMBOL(copy_from_user_overflow);
index 77ebaa3dfa12583a88882c2e416cf5c236a2d6d2..770a422a42e8d3d49deda5cf6d43581ddf1ab220 100644 (file)
@@ -1292,6 +1292,24 @@ config LATENCYTOP
          Enable this option if you want to use the LatencyTOP tool
          to find out which userspace is blocking on what kernel operations.
 
+config ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
+       bool
+
+config DEBUG_STRICT_USER_COPY_CHECKS
+       bool "Strict user copy size checks"
+       depends on ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
+       depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
+       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, say N.
+
 source mm/Kconfig.debug
 source kernel/trace/Kconfig
 
index 23c9a0fe74fc85b5ab07144583241176e62d613f..e9c52e1b853a658c0b99580e092023d7f53a341e 100644 (file)
@@ -15,6 +15,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
         is_single_threaded.o plist.o decompress.o kobject_uevent.o \
         earlycpio.o
 
+obj-$(CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS) += usercopy.o
 lib-$(CONFIG_MMU) += ioremap.o
 lib-$(CONFIG_SMP) += cpumask.o
 
diff --git a/lib/usercopy.c b/lib/usercopy.c
new file mode 100644 (file)
index 0000000..4f5b1dd
--- /dev/null
@@ -0,0 +1,9 @@
+#include <linux/export.h>
+#include <linux/bug.h>
+#include <linux/uaccess.h>
+
+void copy_from_user_overflow(void)
+{
+       WARN(1, "Buffer overflow detected!\n");
+}
+EXPORT_SYMBOL(copy_from_user_overflow);