//===- FuzzerShmem.h - shared memory interface ------------------*- C++ -* ===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // SharedMemoryRegion //===----------------------------------------------------------------------===// #ifndef LLVM_FUZZER_SHMEM_H #define LLVM_FUZZER_SHMEM_H #include #include #include #include "FuzzerDefs.h" namespace fuzzer { class SharedMemoryRegion { public: bool Create(const char *Name); bool Open(const char *Name); bool Destroy(const char *Name); uint8_t *GetData() { return Data; } void PostServer() {Post(0);} void WaitServer() {Wait(0);} void PostClient() {Post(1);} void WaitClient() {Wait(1);} size_t WriteByteArray(const uint8_t *Bytes, size_t N) { assert(N <= kShmemSize - sizeof(N)); memcpy(GetData(), &N, sizeof(N)); memcpy(GetData() + sizeof(N), Bytes, N); assert(N == ReadByteArraySize()); return N; } size_t ReadByteArraySize() { size_t Res; memcpy(&Res, GetData(), sizeof(Res)); return Res; } uint8_t *GetByteArray() { return GetData() + sizeof(size_t); } bool IsServer() const { return Data && IAmServer; } bool IsClient() const { return Data && !IAmServer; } private: static const size_t kShmemSize = 1 << 22; bool IAmServer; std::string Path(const char *Name); std::string SemName(const char *Name, int Idx); void Post(int Idx); void Wait(int Idx); bool Map(int fd); uint8_t *Data = nullptr; void *Semaphore[2]; }; extern SharedMemoryRegion SMR; } // namespace fuzzer #endif // LLVM_FUZZER_SHMEM_H