// Updates contents so that any read accesses past the last byte will // cause a SIGSEGV. It accomplishes this by changing access to the page that // begins immediately after the end of the contents (as allocators and mmap() // all operate on page boundaries, this is a reasonable assumption). // This function will also initialize buf, which caller must free(). void createProtectedBuf(StringPiece& contents, char** buf) { ASSERT_LE(contents.size(), kPageSize); const size_t kSuccess = 0; char* tmp; if (kSuccess != posix_memalign((void**)buf, kPageSize, 2 * kPageSize)) { ASSERT_FALSE(true); } mprotect(*buf + kPageSize, kPageSize, PROT_NONE); size_t newBegin = kPageSize - contents.size(); memcpy(*buf + newBegin, contents.data(), contents.size()); contents.reset(*buf + newBegin, contents.size()); }
// Updates contents so that any read accesses past the last byte will // cause a SIGSEGV. It accomplishes this by changing access to the page that // begins immediately after the end of the contents (as allocators and mmap() // all operate on page boundaries, this is a reasonable assumption). // This function will also initialize buf, which caller must free(). void createProtectedBuf(StringPiece& contents, char** buf) { ASSERT_LE(contents.size(), kPageSize); const size_t kSuccess = 0; char* pageAlignedBuf = (char*)aligned_malloc(2 * kPageSize, kPageSize); if (pageAlignedBuf == nullptr) { ASSERT_FALSE(true); } // Protect the page after the first full page-aligned region of the // malloc'ed buffer mprotect(pageAlignedBuf + kPageSize, kPageSize, PROT_NONE); size_t newBegin = kPageSize - contents.size(); memcpy(pageAlignedBuf + newBegin, contents.data(), contents.size()); contents.reset(pageAlignedBuf + newBegin, contents.size()); *buf = pageAlignedBuf; }