|
@@ -248,22 +248,28 @@ unsigned long __copy_user(void __user *to, const void __user *from, unsigned lon
|
|
|
|
|
|
static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
|
{
|
|
|
- if (n && __access_ok((unsigned long) to, n))
|
|
|
+ if (n && __access_ok((unsigned long) to, n)) {
|
|
|
+ if (!__builtin_constant_p(n))
|
|
|
+ check_object_size(from, n, true);
|
|
|
return __copy_user(to, (__force void __user *) from, n);
|
|
|
- else
|
|
|
+ } else
|
|
|
return n;
|
|
|
}
|
|
|
|
|
|
static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
|
{
|
|
|
+ if (!__builtin_constant_p(n))
|
|
|
+ check_object_size(from, n, true);
|
|
|
return __copy_user(to, (__force void __user *) from, n);
|
|
|
}
|
|
|
|
|
|
static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
|
{
|
|
|
- if (n && __access_ok((unsigned long) from, n))
|
|
|
+ if (n && __access_ok((unsigned long) from, n)) {
|
|
|
+ if (!__builtin_constant_p(n))
|
|
|
+ check_object_size(to, n, false);
|
|
|
return __copy_user((__force void __user *) to, from, n);
|
|
|
- else
|
|
|
+ } else
|
|
|
return n;
|
|
|
}
|
|
|
|