From grsecurity-2.1.14-2.6.31.6-200912051443.patch: -#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) +#define __access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) +#define access_ok(type, addr, size) \ +({ \ + long __size = size; \ + unsigned long __addr = (unsigned long)addr; \ + unsigned long __addr_ao = __addr & PAGE_MASK; \ + unsigned long __end_ao = __addr + __size - 1; \ + bool __ret_ao = __range_not_ok(__addr, __size) == 0; \ + if (__ret_ao && unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) { \ + for (; __addr_ao <= __end_ao; __addr_ao += PAGE_SIZE) { \ + char __c_ao; \ + if (__size > PAGE_SIZE) \ + cond_resched(); \ + if (__get_user(__c_ao, (char __user *)__addr_ao))\ + break; \ + if (type != VERIFY_WRITE) \ + continue; \ + if (__put_user(__c_ao, (char __user *)__addr_ao))\ + break; \ + } \ + } \ + __ret_ao; \ +})