/* Returns 1 if Data Execution Prevention is present and working */ static int NaClAttemptToExecuteData() { int result; char *thunk_buffer = malloc(64); nacl_void_thunk thunk; /* d'b: small fixes */ if(thunk_buffer == NULL) return 0; thunk = NaClGenerateThunk(thunk_buffer, 64); setup_signals(); if(0 == sigsetjmp(try_state, 1)) { thunk(); result = 0; } else { result = 1; } restore_signals(); free(thunk_buffer); return result; }
int NaClAttemptToExecuteDataAtAddr(char *thunk_buffer, size_t size) { int result; MachExceptionHandlerData saved_handlers; nacl_void_thunk thunk = NaClGenerateThunk(thunk_buffer, size); setup_signals(); DisableMachExceptionHandler(&saved_handlers); if (0 == sigsetjmp(try_state, 1)) { thunk(); result = 0; } else { result = 1; } EnableMachExceptionHandler(&saved_handlers); restore_signals(); return result; }