blob: 43b87a5010cc10fff2c52e1eff60381faefd3df7 [file] [log] [blame]
// 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