summaryrefslogtreecommitdiff
path: root/lib/fuzzer/FuzzerShmem.h
blob: 53568e0acb69c93c6789b3a7354c2479f3db4fa3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//===- 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 <algorithm>
#include <cstring>
#include <string>

#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