diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-03-23 05:59:35 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-23 10:38:04 -0500 |
commit | 30e931d4092713cecd6b8c2fd70f268efaa6e428 (patch) | |
tree | e7425d6e23720399d4f1a3078e63e03d62ca1d63 /include/asm-i386 | |
parent | 4f88651125e2ca8b106b6f65b65ea45776517bf3 (diff) |
[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: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/asm-i386')
-rw-r--r-- | include/asm-i386/uaccess.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/include/asm-i386/uaccess.h b/include/asm-i386/uaccess.h index 3f1337c34208..371457b1ceb6 100644 --- a/include/asm-i386/uaccess.h +++ b/include/asm-i386/uaccess.h | |||
@@ -197,13 +197,15 @@ extern void __put_user_8(void); | |||
197 | 197 | ||
198 | #define put_user(x,ptr) \ | 198 | #define put_user(x,ptr) \ |
199 | ({ int __ret_pu; \ | 199 | ({ int __ret_pu; \ |
200 | __typeof__(*(ptr)) __pu_val; \ | ||
200 | __chk_user_ptr(ptr); \ | 201 | __chk_user_ptr(ptr); \ |
202 | __pu_val = x; \ | ||
201 | switch(sizeof(*(ptr))) { \ | 203 | switch(sizeof(*(ptr))) { \ |
202 | case 1: __put_user_1(x, ptr); break; \ | 204 | case 1: __put_user_1(__pu_val, ptr); break; \ |
203 | case 2: __put_user_2(x, ptr); break; \ | 205 | case 2: __put_user_2(__pu_val, ptr); break; \ |
204 | case 4: __put_user_4(x, ptr); break; \ | 206 | case 4: __put_user_4(__pu_val, ptr); break; \ |
205 | case 8: __put_user_8(x, ptr); break; \ | 207 | case 8: __put_user_8(__pu_val, ptr); break; \ |
206 | default:__put_user_X(x, ptr); break; \ | 208 | default:__put_user_X(__pu_val, ptr); break; \ |
207 | } \ | 209 | } \ |
208 | __ret_pu; \ | 210 | __ret_pu; \ |
209 | }) | 211 | }) |