| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "sandbox/linux/tests/test_utils.h" |
| |
| #include <errno.h> |
| #include <sys/mman.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <sys/wait.h> |
| #include <unistd.h> |
| |
| #include <cstdint> |
| |
| #include "base/check_op.h" |
| #include "base/compiler_specific.h" |
| #include "base/memory/page_size.h" |
| #include "base/posix/eintr_wrapper.h" |
| |
| namespace sandbox { |
| |
| bool TestUtils::CurrentProcessHasChildren() { |
| siginfo_t process_info; |
| int ret = HANDLE_EINTR( |
| waitid(P_ALL, 0, &process_info, WEXITED | WNOHANG | WNOWAIT)); |
| if (-1 == ret) { |
| PCHECK(ECHILD == errno); |
| return false; |
| } else { |
| return true; |
| } |
| } |
| |
| void TestUtils::HandlePostForkReturn(pid_t pid) { |
| const int kChildExitCode = 1; |
| if (pid > 0) { |
| int status = 0; |
| PCHECK(pid == HANDLE_EINTR(waitpid(pid, &status, 0))); |
| CHECK(WIFEXITED(status)); |
| CHECK_EQ(kChildExitCode, WEXITSTATUS(status)); |
| } else if (pid == 0) { |
| _exit(kChildExitCode); |
| } |
| } |
| |
| void* TestUtils::MapPagesOrDie(size_t num_pages) { |
| void* addr = mmap(nullptr, num_pages * base::GetPageSize(), |
| PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| PCHECK(addr); |
| return addr; |
| } |
| |
| void TestUtils::MprotectLastPageOrDie(char* addr, size_t num_pages) { |
| size_t last_page_offset = (num_pages - 1) * base::GetPageSize(); |
| UNSAFE_TODO(PCHECK( |
| mprotect(addr + last_page_offset, base::GetPageSize(), PROT_NONE) >= 0)); |
| } |
| |
| } // namespace sandbox |