h8300: fix recent uaccess breakage
Al Viro wrote: > > After that commit in asm-h8300/uaccess.h we have > > #define get_user(x, ptr) \ > ({ \ > int __gu_err = 0; \ > uint32_t __gu_val = 0; \ > ^^^^^^^^^^^^^^^^^ > switch (sizeof(*(ptr))) { \ > case 1: \ > case 2: \ > case 4: \ > __gu_val = *(ptr); \ > break; \ > case 8: \ > memcpy(&__gu_val, ptr, sizeof (*(ptr))); \ > ^^^^^^^^^^^^^^^^ > > which, of course, is FUBAR whenever we actually hit that case - memcpy of > 8 bytes into uint32_t is obviously wrong. Why don't we simply do Cc: Al Viro <viro@ZenIV.linux.org.uk> Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
fb39380b8d
commit
12d48739d0
1 changed files with 4 additions and 7 deletions
|
@ -91,22 +91,19 @@ extern int __put_user_bad(void);
|
||||||
#define get_user(x, ptr) \
|
#define get_user(x, ptr) \
|
||||||
({ \
|
({ \
|
||||||
int __gu_err = 0; \
|
int __gu_err = 0; \
|
||||||
uint32_t __gu_val = 0; \
|
typeof(*(ptr)) __gu_val = *ptr; \
|
||||||
switch (sizeof(*(ptr))) { \
|
switch (sizeof(*(ptr))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
case 2: \
|
case 2: \
|
||||||
case 4: \
|
case 4: \
|
||||||
__gu_val = *(ptr); \
|
case 8: \
|
||||||
break; \
|
|
||||||
case 8: \
|
|
||||||
memcpy(&__gu_val, ptr, sizeof (*(ptr))); \
|
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
__gu_val = 0; \
|
|
||||||
__gu_err = __get_user_bad(); \
|
__gu_err = __get_user_bad(); \
|
||||||
|
__gu_val = 0; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
(x) = (typeof(*(ptr)))__gu_val; \
|
(x) = __gu_val; \
|
||||||
__gu_err; \
|
__gu_err; \
|
||||||
})
|
})
|
||||||
#define __get_user(x, ptr) get_user(x, ptr)
|
#define __get_user(x, ptr) get_user(x, ptr)
|
||||||
|
|
Loading…
Add table
Reference in a new issue