Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2561d309 authored by Al Viro's avatar Al Viro
Browse files

alpha: fix copy_from_user()



it should clear the destination even when access_ok() fails.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 694d0d0b
Loading
Loading
Loading
Loading
+8 −11
Original line number Original line Diff line number Diff line
@@ -371,14 +371,6 @@ __copy_tofrom_user_nocheck(void *to, const void *from, long len)
	return __cu_len;
	return __cu_len;
}
}


extern inline long
__copy_tofrom_user(void *to, const void *from, long len, const void __user *validate)
{
	if (__access_ok((unsigned long)validate, len, get_fs()))
		len = __copy_tofrom_user_nocheck(to, from, len);
	return len;
}

#define __copy_to_user(to, from, n)					\
#define __copy_to_user(to, from, n)					\
({									\
({									\
	__chk_user_ptr(to);						\
	__chk_user_ptr(to);						\
@@ -393,17 +385,22 @@ __copy_tofrom_user(void *to, const void *from, long len, const void __user *vali
#define __copy_to_user_inatomic __copy_to_user
#define __copy_to_user_inatomic __copy_to_user
#define __copy_from_user_inatomic __copy_from_user
#define __copy_from_user_inatomic __copy_from_user



extern inline long
extern inline long
copy_to_user(void __user *to, const void *from, long n)
copy_to_user(void __user *to, const void *from, long n)
{
{
	return __copy_tofrom_user((__force void *)to, from, n, to);
	if (likely(__access_ok((unsigned long)to, n, get_fs())))
		n = __copy_tofrom_user_nocheck((__force void *)to, from, n);
	return n;
}
}


extern inline long
extern inline long
copy_from_user(void *to, const void __user *from, long n)
copy_from_user(void *to, const void __user *from, long n)
{
{
	return __copy_tofrom_user(to, (__force void *)from, n, from);
	if (likely(__access_ok((unsigned long)from, n, get_fs())))
		n = __copy_tofrom_user_nocheck(to, (__force void *)from, n);
	else
		memset(to, 0, n);
	return n;
}
}


extern void __do_clear_user(void);
extern void __do_clear_user(void);