int32_t NaClSysExceptionStack(struct NaClAppThread *natp, uint32_t stack_addr, uint32_t stack_size) { if (!natp->nap->enable_exception_handling) { return -NACL_ABI_ENOSYS; } if (kNaClBadAddress == NaClUserToSysAddrNullOkay(natp->nap, stack_addr + stack_size)) { return -NACL_ABI_EINVAL; } natp->exception_stack = stack_addr + stack_size; return 0; }
/* * check "prot" access for user area (start, size) * if failed return -1, otherwise - 0 */ static int CheckRAMAccess(struct NaClApp *nap, uintptr_t start, int64_t size, int prot) { int i; start = NaClUserToSysAddrNullOkay(nap, start); for(i = LeftBumperIdx; i < MemMapSize; ++i) { /* skip until start hit block in mem_map */ if(start >= nap->mem_map[i].end) continue; /* fail if block protection doesn't meat prot */ if((prot & nap->mem_map[i].prot) == 0) return -1; /* subtract checked space from given area */ size -= (nap->mem_map[i].end - start); if(size <= 0) return 0; start = nap->mem_map[i].end; } return -1; }