diff options
| -rw-r--r-- | arch/alpha/include/asm/uaccess.h | 8 | ||||
| -rw-r--r-- | arch/sh/include/asm/uaccess.h | 7 |
2 files changed, 10 insertions, 5 deletions
diff --git a/arch/alpha/include/asm/uaccess.h b/arch/alpha/include/asm/uaccess.h index e69c4e13c328..cf4ac791a592 100644 --- a/arch/alpha/include/asm/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h | |||
| @@ -30,11 +30,13 @@ | |||
| 30 | * Address valid if: | 30 | * Address valid if: |
| 31 | * - "addr" doesn't have any high-bits set | 31 | * - "addr" doesn't have any high-bits set |
| 32 | * - AND "size" doesn't have any high-bits set | 32 | * - AND "size" doesn't have any high-bits set |
| 33 | * - AND "addr+size" doesn't have any high-bits set | 33 | * - AND "addr+size-(size != 0)" doesn't have any high-bits set |
| 34 | * - OR we are in kernel mode. | 34 | * - OR we are in kernel mode. |
| 35 | */ | 35 | */ |
| 36 | #define __access_ok(addr, size) \ | 36 | #define __access_ok(addr, size) ({ \ |
| 37 | ((get_fs().seg & (addr | size | (addr+size))) == 0) | 37 | unsigned long __ao_a = (addr), __ao_b = (size); \ |
| 38 | unsigned long __ao_end = __ao_a + __ao_b - !!__ao_b; \ | ||
| 39 | (get_fs().seg & (__ao_a | __ao_b | __ao_end)) == 0; }) | ||
| 38 | 40 | ||
| 39 | #define access_ok(addr, size) \ | 41 | #define access_ok(addr, size) \ |
| 40 | ({ \ | 42 | ({ \ |
diff --git a/arch/sh/include/asm/uaccess.h b/arch/sh/include/asm/uaccess.h index deebbfab5342..5fe751ad7582 100644 --- a/arch/sh/include/asm/uaccess.h +++ b/arch/sh/include/asm/uaccess.h | |||
| @@ -16,8 +16,11 @@ | |||
| 16 | * sum := addr + size; carry? --> flag = true; | 16 | * sum := addr + size; carry? --> flag = true; |
| 17 | * if (sum >= addr_limit) flag = true; | 17 | * if (sum >= addr_limit) flag = true; |
| 18 | */ | 18 | */ |
| 19 | #define __access_ok(addr, size) \ | 19 | #define __access_ok(addr, size) ({ \ |
| 20 | (__addr_ok((addr) + (size))) | 20 | unsigned long __ao_a = (addr), __ao_b = (size); \ |
| 21 | unsigned long __ao_end = __ao_a + __ao_b - !!__ao_b; \ | ||
| 22 | __ao_end >= __ao_a && __addr_ok(__ao_end); }) | ||
| 23 | |||
| 21 | #define access_ok(addr, size) \ | 24 | #define access_ok(addr, size) \ |
| 22 | (__chk_user_ptr(addr), \ | 25 | (__chk_user_ptr(addr), \ |
| 23 | __access_ok((unsigned long __force)(addr), (size))) | 26 | __access_ok((unsigned long __force)(addr), (size))) |
