diff options
author | van Hauser <vh@thc.org> | 2019-07-14 20:04:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-14 20:04:26 +0200 |
commit | 054976c3903771e2267cfcf67f38fec3ced2ab77 (patch) | |
tree | 21e2f2e0bbe93341c3813d96576c5e83f62195d0 /llvm_mode/afl-llvm-rt.o.c | |
parent | 4a80dbdd10aedd3a3e70a0631aeb4e01438b634c (diff) | |
parent | da8e03e18a1d01cb4ea26fc8efb25c4e7708a0b5 (diff) | |
download | afl++-054976c3903771e2267cfcf67f38fec3ced2ab77.tar.gz |
Merge pull request #14 from vanhauser-thc/shared_memory_mmap_refactor
Shared memory mmap refactor
Diffstat (limited to 'llvm_mode/afl-llvm-rt.o.c')
-rw-r--r-- | llvm_mode/afl-llvm-rt.o.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm_mode/afl-llvm-rt.o.c b/llvm_mode/afl-llvm-rt.o.c index 342dcc90..debde204 100644 --- a/llvm_mode/afl-llvm-rt.o.c +++ b/llvm_mode/afl-llvm-rt.o.c @@ -44,6 +44,9 @@ # define CONST_PRIO 0 #endif /* ^USE_TRACE_PC */ +#include <sys/mman.h> +#include <fcntl.h> + /* Globals needed by the injected instrumentation. The __afl_area_initial region is used for instrumentation output before __afl_map_shm() has a chance to run. @@ -71,10 +74,34 @@ static void __afl_map_shm(void) { hacky .init code to work correctly in projects such as OpenSSL. */ if (id_str) { +#ifdef USEMMAP + const char *shm_file_path = id_str; + int shm_fd = -1; + unsigned char *shm_base = NULL; + + /* create the shared memory segment as if it was a file */ + shm_fd = shm_open(shm_file_path, O_RDWR, 0600); + if (shm_fd == -1) { + printf("shm_open() failed\n"); + exit(1); + } + + /* map the shared memory segment to the address space of the process */ + shm_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); + if (shm_base == MAP_FAILED) { + close(shm_fd); + shm_fd = -1; + printf("mmap() failed\n"); + exit(2); + } + + __afl_area_ptr = shm_base; +#else u32 shm_id = atoi(id_str); __afl_area_ptr = shmat(shm_id, NULL, 0); +#endif /* Whooooops. */ |