nios2: use generic strncpy_from_user() and strnlen_user()
authorLey Foon Tan <ley.foon.tan@intel.com>
Mon, 8 May 2017 09:14:14 +0000 (17:14 +0800)
committerLey Foon Tan <ley.foon.tan@intel.com>
Mon, 8 May 2017 09:14:14 +0000 (17:14 +0800)
This change enables the generic strncpy_from_user() and strnlen_user()

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
arch/nios2/Kconfig
arch/nios2/include/asm/uaccess.h
arch/nios2/mm/uaccess.c

index 51a56c8..a72d5f0 100644 (file)
@@ -6,6 +6,8 @@ config NIOS2
        select GENERIC_CPU_DEVICES
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
+       select GENERIC_STRNCPY_FROM_USER
+       select GENERIC_STRNLEN_USER
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_KGDB
        select IRQ_DOMAIN
index 727bd95..dfa3c7c 100644 (file)
@@ -42,6 +42,8 @@
 
 # define __EX_TABLE_SECTION    ".section __ex_table,\"a\"\n"
 
+#define user_addr_max() (uaccess_kernel() ? ~0UL : TASK_SIZE)
+
 /*
  * Zero Userspace
  */
@@ -81,8 +83,9 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n);
 #define INLINE_COPY_TO_USER
 
 extern long strncpy_from_user(char *__to, const char __user *__from,
-                               long __len);
-extern long strnlen_user(const char __user *s, long n);
+                             long __len);
+extern __must_check long strlen_user(const char __user *str);
+extern __must_check long strnlen_user(const char __user *s, long n);
 
 /* Optimized macros */
 #define __get_user_asm(val, insn, addr, err)                           \
index 8049833..34f10af 100644 (file)
@@ -128,36 +128,3 @@ asm(
        ".word 12b,13b\n"
        ".previous\n");
 EXPORT_SYMBOL(raw_copy_to_user);
-
-long strncpy_from_user(char *__to, const char __user *__from, long __len)
-{
-       int l = strnlen_user(__from, __len);
-       int is_zt = 1;
-
-       if (l > __len) {
-               is_zt = 0;
-               l = __len;
-       }
-
-       if (l == 0 || copy_from_user(__to, __from, l))
-               return -EFAULT;
-
-       if (is_zt)
-               l--;
-       return l;
-}
-
-long strnlen_user(const char __user *s, long n)
-{
-       long i;
-
-       for (i = 0; i < n; i++) {
-               char c;
-
-               if (get_user(c, s + i) == -EFAULT)
-                       return 0;
-               if (c == 0)
-                       return i + 1;
-       }
-       return n + 1;
-}