diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2015-01-06 07:37:22 -0500 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2015-01-13 08:23:30 -0500 |
commit | e8b94dea3867139fe92f03b913e38ca841e390fd (patch) | |
tree | a3df535766769fec88531432f514b44e32af1167 /arch/arm | |
parent | 09a2f7cf6a89ec011bda8c0f0f8d0790a1176973 (diff) |
arm: fix put_user sparse errors
virtio wants to write bitwise types to userspace using put_user.
At the moment this triggers sparse errors, since the value is passed
through an integer.
For example:
__le32 __user *p;
__le32 x;
put_user(x, p);
is safe, but currently triggers a sparse warning.
Fix that up using __force.
Note: this does not suppress any useful sparse checks since caller
assigns x to typeof(*p), which in turn forces all the necessary type
checks.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/uaccess.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 4767eb9caa78..74fcde756fdb 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h | |||
@@ -413,14 +413,14 @@ do { \ | |||
413 | #ifndef __ARMEB__ | 413 | #ifndef __ARMEB__ |
414 | #define __put_user_asm_half(x,__pu_addr,err) \ | 414 | #define __put_user_asm_half(x,__pu_addr,err) \ |
415 | ({ \ | 415 | ({ \ |
416 | unsigned long __temp = (unsigned long)(x); \ | 416 | unsigned long __temp = (__force unsigned long)(x); \ |
417 | __put_user_asm_byte(__temp, __pu_addr, err); \ | 417 | __put_user_asm_byte(__temp, __pu_addr, err); \ |
418 | __put_user_asm_byte(__temp >> 8, __pu_addr + 1, err); \ | 418 | __put_user_asm_byte(__temp >> 8, __pu_addr + 1, err); \ |
419 | }) | 419 | }) |
420 | #else | 420 | #else |
421 | #define __put_user_asm_half(x,__pu_addr,err) \ | 421 | #define __put_user_asm_half(x,__pu_addr,err) \ |
422 | ({ \ | 422 | ({ \ |
423 | unsigned long __temp = (unsigned long)(x); \ | 423 | unsigned long __temp = (__force unsigned long)(x); \ |
424 | __put_user_asm_byte(__temp >> 8, __pu_addr, err); \ | 424 | __put_user_asm_byte(__temp >> 8, __pu_addr, err); \ |
425 | __put_user_asm_byte(__temp, __pu_addr + 1, err); \ | 425 | __put_user_asm_byte(__temp, __pu_addr + 1, err); \ |
426 | }) | 426 | }) |