aboutsummaryrefslogtreecommitdiff
path: root/arch/csky
diff options
context:
space:
mode:
authorArnd Bergmann2020-01-16 13:18:38 +0100
committerArnd Bergmann2021-07-23 14:39:56 +0200
commitf27180dd63e1e6eca3230b9d3fdcc33564a81117 (patch)
tree32f334f2fad44c2b989b546970e830a165ebc1ce /arch/csky
parent2734d6c1b1a089fb593ef6a23d4b70903526fe0c (diff)
asm-generic/uaccess.h: remove __strncpy_from_user/__strnlen_user
This is a preparation for changing over architectures to the generic implementation one at a time. As there are no callers of either __strncpy_from_user() or __strnlen_user(), fold these into the strncpy_from_user() and strnlen_user() functions to make each implementation independent of the others. Many of these implementations have known bugs, but the intention here is to not change behavior at all and stay compatible with those bugs for the moment. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/csky')
-rw-r--r--arch/csky/include/asm/uaccess.h8
-rw-r--r--arch/csky/lib/usercopy.c14
2 files changed, 14 insertions, 8 deletions
diff --git a/arch/csky/include/asm/uaccess.h b/arch/csky/include/asm/uaccess.h
index ac83823fc437..e17c02a6709f 100644
--- a/arch/csky/include/asm/uaccess.h
+++ b/arch/csky/include/asm/uaccess.h
@@ -209,11 +209,11 @@ unsigned long raw_copy_to_user(void *to, const void *from, unsigned long n);
unsigned long __clear_user(void __user *to, unsigned long n);
#define __clear_user __clear_user
-long __strncpy_from_user(char *dst, const char *src, long count);
-#define __strncpy_from_user __strncpy_from_user
+long strncpy_from_user(char *dst, const char *src, long count);
+#define strncpy_from_user strncpy_from_user
-long __strnlen_user(const char *s, long n);
-#define __strnlen_user __strnlen_user
+long strnlen_user(const char *s, long n);
+#define strnlen_user strnlen_user
#include <asm/segment.h>
#include <asm-generic/uaccess.h>
diff --git a/arch/csky/lib/usercopy.c b/arch/csky/lib/usercopy.c
index c5d394a0ae78..05b36e9fd7d3 100644
--- a/arch/csky/lib/usercopy.c
+++ b/arch/csky/lib/usercopy.c
@@ -163,11 +163,14 @@ EXPORT_SYMBOL(raw_copy_to_user);
* If @count is smaller than the length of the string, copies @count bytes
* and returns @count.
*/
-long __strncpy_from_user(char *dst, const char *src, long count)
+long strncpy_from_user(char *dst, const char *src, long count)
{
long res, faultres;
int tmp;
+ if (!access_ok(s, 1))
+ return -EFAULT;
+
__asm__ __volatile__(
" cmpnei %3, 0 \n"
" bf 4f \n"
@@ -198,7 +201,7 @@ long __strncpy_from_user(char *dst, const char *src, long count)
return res;
}
-EXPORT_SYMBOL(__strncpy_from_user);
+EXPORT_SYMBOL(strncpy_from_user);
/*
* strnlen_user: - Get the size of a string in user space.
@@ -211,10 +214,13 @@ EXPORT_SYMBOL(__strncpy_from_user);
* On exception, returns 0.
* If the string is too long, returns a value greater than @n.
*/
-long __strnlen_user(const char *s, long n)
+long strnlen_user(const char *s, long n)
{
unsigned long res, tmp;
+ if (!access_ok(s, 1))
+ return -EFAULT;
+
__asm__ __volatile__(
" cmpnei %1, 0 \n"
" bf 3f \n"
@@ -242,7 +248,7 @@ long __strnlen_user(const char *s, long n)
return res;
}
-EXPORT_SYMBOL(__strnlen_user);
+EXPORT_SYMBOL(strnlen_user);
/*
* __clear_user: - Zero a block of memory in user space, with less checking.