mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
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
@ -91,22 +91,19 @@ extern int __put_user_bad(void);
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
int __gu_err = 0; \
|
||||
uint32_t __gu_val = 0; \
|
||||
typeof(*(ptr)) __gu_val = *ptr; \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
case 2: \
|
||||
case 4: \
|
||||
__gu_val = *(ptr); \
|
||||
break; \
|
||||
case 8: \
|
||||
memcpy(&__gu_val, ptr, sizeof (*(ptr))); \
|
||||
case 8: \
|
||||
break; \
|
||||
default: \
|
||||
__gu_val = 0; \
|
||||
__gu_err = __get_user_bad(); \
|
||||
__gu_val = 0; \
|
||||
break; \
|
||||
} \
|
||||
(x) = (typeof(*(ptr)))__gu_val; \
|
||||
(x) = __gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
#define __get_user(x, ptr) get_user(x, ptr)
|
||||
|
Loading…
Reference in New Issue
Block a user