Commit 30e931d4 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

[PATCH] i386: Add a temporary to make put_user more type safe

In some code I am developing I had occasion to change the type of a
variable.  This made the value put_user was putting to user space wrong.
But the code continued to build cleanly without errors.

Introducing a temporary fixes this problem and at least with gcc-3.3.5 does
not cause gcc any problems with optimizing out the temporary.  gcc-4.x
using SSA internally ought to be even better at optimizing out temporaries,
so I don't expect a temporary to become a problem.  Especially because in
all correct cases the types on both sides of the assignment to the
temporary are the same.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4f886511
...@@ -197,13 +197,15 @@ extern void __put_user_8(void); ...@@ -197,13 +197,15 @@ extern void __put_user_8(void);
#define put_user(x,ptr) \ #define put_user(x,ptr) \
({ int __ret_pu; \ ({ int __ret_pu; \
__typeof__(*(ptr)) __pu_val; \
__chk_user_ptr(ptr); \ __chk_user_ptr(ptr); \
__pu_val = x; \
switch(sizeof(*(ptr))) { \ switch(sizeof(*(ptr))) { \
case 1: __put_user_1(x, ptr); break; \ case 1: __put_user_1(__pu_val, ptr); break; \
case 2: __put_user_2(x, ptr); break; \ case 2: __put_user_2(__pu_val, ptr); break; \
case 4: __put_user_4(x, ptr); break; \ case 4: __put_user_4(__pu_val, ptr); break; \
case 8: __put_user_8(x, ptr); break; \ case 8: __put_user_8(__pu_val, ptr); break; \
default:__put_user_X(x, ptr); break; \ default:__put_user_X(__pu_val, ptr); break; \
} \ } \
__ret_pu; \ __ret_pu; \
}) })
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment