#include "base/test/test_shared_memory_util.h"
#include <gtest/gtest.h>
#include <stddef.h>
#include <stdint.h>
#include "base/logging.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL)
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
#endif
#if BUILDFLAG(IS_FUCHSIA)
#include <lib/zx/vmar.h>
#include <zircon/rights.h>
#endif
#if BUILDFLAG(IS_APPLE)
#include <mach/vm_map.h>
#endif
#if BUILDFLAG(IS_WIN)
#include <aclapi.h>
#endif
namespace base {
#if !BUILDFLAG(IS_NACL)
static const size_t kDataSize = …;
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
static bool CheckReadOnlySharedMemoryFdPosix(int fd) { … }
#endif
#if BUILDFLAG(IS_FUCHSIA)
bool CheckReadOnlySharedMemoryFuchsiaHandle(zx::unowned_vmo handle) {
const uint32_t flags = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE;
uintptr_t addr;
const zx_status_t status =
zx::vmar::root_self()->map(flags, 0, *handle, 0U, kDataSize, &addr);
if (status == ZX_OK) {
LOG(ERROR) << "zx_vmar_map() should have failed!";
zx::vmar::root_self()->unmap(addr, kDataSize);
return false;
}
if (status != ZX_ERR_ACCESS_DENIED) {
LOG(ERROR) << "Expected zx_vmar_map() to return " << ZX_ERR_ACCESS_DENIED
<< " (ZX_ERR_ACCESS_DENIED) but returned " << status << "\n";
return false;
}
return true;
}
#elif BUILDFLAG(IS_APPLE)
bool CheckReadOnlySharedMemoryMachPort(mach_port_t memory_object) {
vm_address_t memory;
const kern_return_t kr =
vm_map(mach_task_self(), &memory, kDataSize, 0, VM_FLAGS_ANYWHERE,
memory_object, 0, FALSE, VM_PROT_READ | VM_PROT_WRITE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_IS_MASK, VM_INHERIT_NONE);
if (kr == KERN_SUCCESS) {
LOG(ERROR) << "vm_map() should have failed!";
vm_deallocate(mach_task_self(), memory, kDataSize);
return false;
}
return true;
}
#elif BUILDFLAG(IS_WIN)
bool CheckReadOnlySharedMemoryWindowsHandle(HANDLE handle) {
void* memory =
MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kDataSize);
if (memory != nullptr) {
LOG(ERROR) << "MapViewOfFile() should have failed!";
UnmapViewOfFile(memory);
return false;
}
return true;
}
#endif
bool CheckReadOnlyPlatformSharedMemoryRegionForTesting(
subtle::PlatformSharedMemoryRegion region) { … }
#endif
WritableSharedMemoryMapping MapForTesting(
subtle::PlatformSharedMemoryRegion* region) { … }
WritableSharedMemoryMapping MapAtForTesting(
subtle::PlatformSharedMemoryRegion* region,
uint64_t offset,
size_t size) { … }
template <>
std::pair<ReadOnlySharedMemoryRegion, WritableSharedMemoryMapping>
CreateMappedRegion(size_t size) { … }
}