aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2021-01-23 15:21:22 +0100
committerArnd Bergmann <arnd@arndb.de>2021-02-11 22:31:22 +0100
commit04e17803c96bb95527da87c2cfbac2f7cb6d697f (patch)
tree7b213112a0132fa3a1e9b4222fbf0c8fcd5bbd6b
parent8d30623d1899c9d6d462b8b544a3faa4b4b03ac7 (diff)
downloadplayground-04e17803c96bb95527da87c2cfbac2f7cb6d697f.tar.gz
asm-generic: uaccess: use generic uaccess on m68k, h8300 and riscv
The inline versions of strncpy_from_user() and strnlen_user() have known bugs, so move the last three architectures that use them over to use the generic implementation. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--arch/h8300/Kconfig2
-rw-r--r--arch/m68k/Kconfig4
-rw-r--r--arch/riscv/Kconfig4
-rw-r--r--include/asm-generic/uaccess.h41
4 files changed, 9 insertions, 42 deletions
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
index 3e3e0f16f7e0a..53dfd2d47e0e8 100644
--- a/arch/h8300/Kconfig
+++ b/arch/h8300/Kconfig
@@ -11,6 +11,8 @@ config H8300
select GENERIC_IRQ_SHOW
select FRAME_POINTER
select GENERIC_CPU_DEVICES
+ select GENERIC_STRNCPY_FROM_USER
+ select GENERIC_STRNLEN_USER
select MODULES_USE_ELF_RELA
select COMMON_CLK
select ARCH_WANT_FRAME_POINTERS
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 372e4e69c43ac..8e52415980070 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -16,8 +16,8 @@ config M68K
select GENERIC_CPU_DEVICES
select GENERIC_IOMAP
select GENERIC_IRQ_SHOW
- select GENERIC_STRNCPY_FROM_USER if MMU
- select GENERIC_STRNLEN_USER if MMU
+ select GENERIC_STRNCPY_FROM_USER
+ select GENERIC_STRNLEN_USER
select HAVE_AOUT if MMU
select HAVE_ASM_MODVERSIONS
select HAVE_DEBUG_BUGVERBOSE
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index e0a34eb5ed3b3..b2223b029728d 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -49,8 +49,8 @@ config RISCV
select GENERIC_PTDUMP if MMU
select GENERIC_SCHED_CLOCK
select GENERIC_SMP_IDLE_THREAD
- select GENERIC_STRNCPY_FROM_USER if MMU
- select GENERIC_STRNLEN_USER if MMU
+ select GENERIC_STRNCPY_FROM_USER
+ select GENERIC_STRNLEN_USER
select GENERIC_TIME_VSYSCALL if MMU && 64BIT
select HANDLE_DOMAIN_IRQ
select HAVE_ARCH_AUDITSYSCALL
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
index c03889cc904cf..4f8ce87d25642 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -244,44 +244,6 @@ static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
extern int __get_user_bad(void) __attribute__((noreturn));
/*
- * Copy a null terminated string from userspace.
- */
-#ifndef strncpy_from_user
-static inline long
-strncpy_from_user(char *dst, const char __user *src, long count)
-{
- char *tmp;
-
- if (!access_ok(src, 1))
- return -EFAULT;
-
- strncpy(dst, (const char __force *)src, count);
- for (tmp = dst; *tmp && count > 0; tmp++, count--)
- ;
- return (tmp - dst);
-}
-#endif
-
-#ifndef strnlen_user
-/*
- * Return the size of a string (including the ending 0)
- *
- * Return 0 on exception, a value greater than N if too long
- *
- * Unlike strnlen, strnlen_user includes the nul terminator in
- * its returned count. Callers should check for a returned value
- * greater than N as an indication the string is too long.
- */
-static inline long strnlen_user(const char __user *src, long n)
-{
- if (!access_ok(src, 1))
- return 0;
-
- return strnlen(src, n) + 1;
-}
-#endif
-
-/*
* Zero Userspace
*/
#ifndef __clear_user
@@ -305,4 +267,7 @@ clear_user(void __user *to, unsigned long n)
#include <asm/extable.h>
+extern long strncpy_from_user(char *dst, const char __user *src, long count);
+extern long strnlen_user(const char __user *src, long n);
+
#endif /* __ASM_GENERIC_UACCESS_H */