/* check that no subpage of the superpage is readable */ boolean_t check_nr(mach_vm_address_t addr, mach_vm_size_t size, int *res) { int i; boolean_t ret; for (i=0; i<size/PAGE_SIZE; i++) { if ((ret = check_r(addr+i*PAGE_SIZE, PAGE_SIZE, res))) { sprintf(error, "page still readable"); return FALSE; } } return TRUE; }
boolean_t check_rw(mach_vm_address_t addr, mach_vm_size_t size) { int ret; int res; if (!(ret = check_w(addr, size))) return ret; if (!(ret = check_r(addr, size, &res))) return ret; if ((size==SUPERPAGE_SIZE) && (res!=0xfff00000)) { sprintf(error, "checksum error"); return FALSE; } return TRUE; }
void ps1_checker_2(s_ps1 ps1_st, bool *escaped, bool *checked) { check_n(ps1_st, escaped, checked); check_dollar(ps1_st, escaped, checked); check_a(ps1_st, escaped, checked); check_e(ps1_st, escaped, checked); check_r(ps1_st, escaped, checked); }
/* * The mmap() interface should work just as well! */ boolean_t test_mmap() { int kr, ret; uintptr_t addr = 0; int size = SUPERPAGE_SIZE; addr = (uintptr_t)mmap((void*)addr, size, PROT_READ, MAP_ANON | MAP_PRIVATE, VM_FLAGS_SUPERPAGE_SIZE_2MB, 0); if (addr == (uintptr_t)MAP_FAILED) { sprintf(error, "mmap()"); return FALSE; } if (!(ret = check_addr0(addr, "mach_vm_allocate"))) return ret; if (!(ret = check_align(addr))) return ret; if (!(ret = check_r(addr, SUPERPAGE_SIZE, NULL))) return ret; if (!(ret = check_nw(addr, SUPERPAGE_SIZE))) return ret; kr = munmap((void*)addr, size); if (!(ret = check_kr(kr, "munmap"))) return ret; if (!(ret = check_nr(addr, size, NULL))) return ret; return TRUE; }
/* * If we try to write-protect a sub-page of a superpage * - the call should succeed * - the complete memory should remain readable * - the complete memory should not be writable */ boolean_t test_readonlysubpage() { int kr; int ret; mach_vm_address_t addr = 0; mach_vm_size_t size = SUPERPAGE_SIZE; kr = mach_vm_allocate(mach_task_self(), &addr, size, VM_FLAGS_ANYWHERE | VM_FLAGS_SUPERPAGE_SIZE_2MB); if (!(ret = check_kr(kr, "mach_vm_allocate"))) return ret; mach_vm_protect(mach_task_self(), addr+PAGE_SIZE, PAGE_SIZE, 0, VM_PROT_READ); if (!(ret = check_kr(kr, "mach_vm_protect"))) return ret; if (!(ret = check_r(addr, size, NULL))) return ret; if (!(ret = check_nw(addr, size))) return ret; kr = mach_vm_deallocate(mach_task_self(), addr, size); if (!(ret = check_kr(kr, "mach_vm_deallocate"))) return ret; return TRUE; }