On Tue, Jan 13, 2015 at 02:41:20PM -0500, Chris Metcalf wrote:
> Add an extra intermediate variable to __get_user and __put_user
> to give sparse an opportunity to detect mismatches.
> 
> Signed-off-by: Chris Metcalf <[email protected]>

Reviewed-by: Michael S. Tsirkin <[email protected]>

> ---
>  arch/tile/include/asm/uaccess.h | 19 +++++++++++--------
>  1 file changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h
> index b81b24a8489b..f41cb53cf645 100644
> --- a/arch/tile/include/asm/uaccess.h
> +++ b/arch/tile/include/asm/uaccess.h
> @@ -210,14 +210,16 @@ extern int __get_user_bad(void)
>  #define __get_user(x, ptr)                                           \
>       ({                                                              \
>               int __ret;                                              \
> +             typeof(x) _x;                                           \
>               __chk_user_ptr(ptr);                                    \
>               switch (sizeof(*(ptr))) {                               \
> -             case 1: __get_user_1(x, ptr, __ret); break;             \
> -             case 2: __get_user_2(x, ptr, __ret); break;             \
> -             case 4: __get_user_4(x, ptr, __ret); break;             \
> -             case 8: __get_user_8(x, ptr, __ret); break;             \
> +             case 1: __get_user_1(_x, ptr, __ret); break;            \
> +             case 2: __get_user_2(_x, ptr, __ret); break;            \
> +             case 4: __get_user_4(_x, ptr, __ret); break;            \
> +             case 8: __get_user_8(_x, ptr, __ret); break;            \
>               default: __ret = __get_user_bad(); break;               \
>               }                                                       \
> +             (x) = (typeof(*(ptr))) _x;                              \
>               __ret;                                                  \
>       })
>  
> @@ -289,12 +291,13 @@ extern int __put_user_bad(void)
>  #define __put_user(x, ptr)                                           \
>  ({                                                                   \
>       int __ret;                                                      \
> +     typeof(*(ptr)) _x = (x);                                        \
>       __chk_user_ptr(ptr);                                            \
>       switch (sizeof(*(ptr))) {                                       \
> -     case 1: __put_user_1(x, ptr, __ret); break;                     \
> -     case 2: __put_user_2(x, ptr, __ret); break;                     \
> -     case 4: __put_user_4(x, ptr, __ret); break;                     \
> -     case 8: __put_user_8(x, ptr, __ret); break;                     \
> +     case 1: __put_user_1(_x, ptr, __ret); break;                    \
> +     case 2: __put_user_2(_x, ptr, __ret); break;                    \
> +     case 4: __put_user_4(_x, ptr, __ret); break;                    \
> +     case 8: __put_user_8(_x, ptr, __ret); break;                    \
>       default: __ret = __put_user_bad(); break;                       \
>       }                                                               \
>       __ret;                                                          \
> -- 
> 2.1.2
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to