summaryrefslogtreecommitdiffstats
path: root/include/asm-generic/uaccess.h
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-03-28 01:02:40 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-03-28 16:43:45 -0400
commitc1aad8dcc49382399f48541dc47b6e30b0ef1b62 (patch)
tree1ebef059a1bc6503c19758c31d43563b1aea3846 /include/asm-generic/uaccess.h
parent3fb50075284433093eba7c43e75b16eaa36eeabd (diff)
asm-generic: zero in __get_user(), not __get_user_fn()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'include/asm-generic/uaccess.h')
-rw-r--r--include/asm-generic/uaccess.h18
1 files changed, 6 insertions, 12 deletions
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h
index b048246a606b..bd7a05e9582b 100644
--- a/include/asm-generic/uaccess.h
+++ b/include/asm-generic/uaccess.h
@@ -86,8 +86,7 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
86 86
87static inline int __put_user_fn(size_t size, void __user *ptr, void *x) 87static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
88{ 88{
89 size = __copy_to_user(ptr, x, size); 89 return unlikely(__copy_to_user(ptr, x, size)) ? -EFAULT : 0;
90 return size ? -EFAULT : size;
91} 90}
92 91
93#define __put_user_fn(sz, u, k) __put_user_fn(sz, u, k) 92#define __put_user_fn(sz, u, k) __put_user_fn(sz, u, k)
@@ -102,28 +101,28 @@ extern int __put_user_bad(void) __attribute__((noreturn));
102 __chk_user_ptr(ptr); \ 101 __chk_user_ptr(ptr); \
103 switch (sizeof(*(ptr))) { \ 102 switch (sizeof(*(ptr))) { \
104 case 1: { \ 103 case 1: { \
105 unsigned char __x; \ 104 unsigned char __x = 0; \
106 __gu_err = __get_user_fn(sizeof (*(ptr)), \ 105 __gu_err = __get_user_fn(sizeof (*(ptr)), \
107 ptr, &__x); \ 106 ptr, &__x); \
108 (x) = *(__force __typeof__(*(ptr)) *) &__x; \ 107 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
109 break; \ 108 break; \
110 }; \ 109 }; \
111 case 2: { \ 110 case 2: { \
112 unsigned short __x; \ 111 unsigned short __x = 0; \
113 __gu_err = __get_user_fn(sizeof (*(ptr)), \ 112 __gu_err = __get_user_fn(sizeof (*(ptr)), \
114 ptr, &__x); \ 113 ptr, &__x); \
115 (x) = *(__force __typeof__(*(ptr)) *) &__x; \ 114 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
116 break; \ 115 break; \
117 }; \ 116 }; \
118 case 4: { \ 117 case 4: { \
119 unsigned int __x; \ 118 unsigned int __x = 0; \
120 __gu_err = __get_user_fn(sizeof (*(ptr)), \ 119 __gu_err = __get_user_fn(sizeof (*(ptr)), \
121 ptr, &__x); \ 120 ptr, &__x); \
122 (x) = *(__force __typeof__(*(ptr)) *) &__x; \ 121 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
123 break; \ 122 break; \
124 }; \ 123 }; \
125 case 8: { \ 124 case 8: { \
126 unsigned long long __x; \ 125 unsigned long long __x = 0; \
127 __gu_err = __get_user_fn(sizeof (*(ptr)), \ 126 __gu_err = __get_user_fn(sizeof (*(ptr)), \
128 ptr, &__x); \ 127 ptr, &__x); \
129 (x) = *(__force __typeof__(*(ptr)) *) &__x; \ 128 (x) = *(__force __typeof__(*(ptr)) *) &__x; \
@@ -148,12 +147,7 @@ extern int __put_user_bad(void) __attribute__((noreturn));
148#ifndef __get_user_fn 147#ifndef __get_user_fn
149static inline int __get_user_fn(size_t size, const void __user *ptr, void *x) 148static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
150{ 149{
151 size_t n = __copy_from_user(x, ptr, size); 150 return unlikely(__copy_from_user(x, ptr, size)) ? -EFAULT : 0;
152 if (unlikely(n)) {
153 memset(x + (size - n), 0, n);
154 return -EFAULT;
155 }
156 return 0;
157} 151}
158 152
159#define __get_user_fn(sz, u, k) __get_user_fn(sz, u, k) 153#define __get_user_fn(sz, u, k) __get_user_fn(sz, u, k)