void TestDEPCheckFailurePath(void) { size_t size = NACL_PAGESIZE; void *page; CHECK(NaCl_page_alloc(&page, size) == 0); CHECK(NaCl_mprotect(page, size, PROT_READ | PROT_WRITE | PROT_EXEC) == 0); CHECK(!NaClAttemptToExecuteDataAtAddr(page, size)); /* DEP is not guaranteed to work on x86-32. */ if (!(NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_BUILD_SUBARCH == 32)) { CHECK(NaCl_mprotect(page, size, PROT_READ | PROT_WRITE) == 0); CHECK(NaClAttemptToExecuteDataAtAddr(page, size)); } NaCl_page_free(page, size); }
/* * Returns 1 if Data Execution Prevention is present and working. */ int NaClAttemptToExecuteData(void) { int result; char *thunk_buffer = malloc(64); if (NULL == thunk_buffer) { return 0; } result = NaClAttemptToExecuteDataAtAddr(thunk_buffer, 64); free(thunk_buffer); return result; }