login
Header Space

 
 

[RFC] breakage in 4223cc34365e4 (h8300: uaccess.h update)

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Yoshinori Sato <ysato@...>
Cc: <linux-kernel@...>, Linus Torvalds <torvalds@...>
Date: Sunday, March 2, 2008 - 7:23 pm

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

#define get_user(x, ptr)                                        \
({                                                              \
    int __gu_err = 0;                                           \
    typeof(*(ptr)) __gu_val = *ptr;                             \
    switch (sizeof(*(ptr))) {                                   \
    case 1:                                                     \
    case 2:                                                     \
    case 4:                                                     \
    case 8:                                                     \
        break;                                                  \
    default:                                                    \
        __gu_err = __get_user_bad();                            \
        break;                                                  \
    }                                                           \
    (x) = __gu_val;                                             \
    __gu_err;                                                   \
})

and be done with that, anyway?
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC] breakage in 4223cc34365e4 (h8300: uaccess.h update), Al Viro, (Sun Mar 2, 7:23 pm)
speck-geostationary