sparc: Add full proper error handling to strncpy_from_user().

Linus removed the end-of-address-space hackery from
fs/namei.c:do_getname() so we really have to validate these edge
conditions and cannot cheat any more (as x86 used to as well).

Move to a common C implementation like x86 did.  And if both
src and dst are sufficiently aligned we'll do word at a time
copies and checks as well.

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2012-05-22 17:53:19 -07:00
parent 29af0ebaa2
commit ff06dffbc8
8 changed files with 136 additions and 198 deletions

View file

@ -5,4 +5,7 @@
#else
#include <asm/uaccess_32.h>
#endif
extern long strncpy_from_user(char *dest, const char __user *src, long count);
#endif

View file

@ -304,16 +304,6 @@ static inline unsigned long clear_user(void __user *addr, unsigned long n)
return n;
}
extern long __strncpy_from_user(char *dest, const char __user *src, long count);
static inline long strncpy_from_user(char *dest, const char __user *src, long count)
{
if (__access_ok((unsigned long) src, count))
return __strncpy_from_user(dest, src, count);
else
return -EFAULT;
}
extern long __strlen_user(const char __user *);
extern long __strnlen_user(const char __user *, long len);

View file

@ -257,10 +257,6 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long);
#define clear_user __clear_user
extern long __must_check __strncpy_from_user(char *dest, const char __user *src, long count);
#define strncpy_from_user __strncpy_from_user
extern long __strlen_user(const char __user *);
extern long __strnlen_user(const char __user *, long len);