diff options
author | van Hauser <vh@thc.org> | 2022-05-16 12:34:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-16 12:34:38 +0200 |
commit | a2eb1f14126cffd046c44d5e87e945ed2699cec5 (patch) | |
tree | 2eecf55a92eec04e67aa3a9d9bec8e5f50659de6 /src/afl-sharedmem.c | |
parent | c7bb0a9638a8929a5b664f16032c23a55a84be70 (diff) | |
parent | c08eeb95ca78625cf3f8a96bd04320c57c50d0f1 (diff) | |
download | afl++-a2eb1f14126cffd046c44d5e87e945ed2699cec5.tar.gz |
Merge pull request #1404 from AFLplusplus/dev
push to stable
Diffstat (limited to 'src/afl-sharedmem.c')
-rw-r--r-- | src/afl-sharedmem.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/afl-sharedmem.c b/src/afl-sharedmem.c index 8d58bb3e..b48c6fb3 100644 --- a/src/afl-sharedmem.c +++ b/src/afl-sharedmem.c @@ -107,7 +107,7 @@ void afl_shm_deinit(sharedmem_t *shm) { if (shm->cmp_map != NULL) { munmap(shm->cmp_map, shm->map_size); - shm->map = NULL; + shm->cmp_map = NULL; } @@ -153,6 +153,8 @@ u8 *afl_shm_init(sharedmem_t *shm, size_t map_size, shm->g_shm_fd = -1; shm->cmplog_g_shm_fd = -1; + const int shmflags = O_RDWR | O_EXCL; + /* ====== generate random file name for multi instance @@ -161,9 +163,39 @@ u8 *afl_shm_init(sharedmem_t *shm, size_t map_size, so we do this worse workaround */ snprintf(shm->g_shm_file_path, L_tmpnam, "/afl_%d_%ld", getpid(), random()); + #ifdef SHM_LARGEPAGE_ALLOC_DEFAULT + /* trying to get large memory segment optimised and monitorable separately as + * such */ + static size_t sizes[4] = {(size_t)-1}; + static int psizes = 0; + int i; + if (sizes[0] == (size_t)-1) { psizes = getpagesizes(sizes, 4); } + + /* very unlikely to fail even if the arch supports only two sizes */ + if (likely(psizes > 0)) { + + for (i = psizes - 1; shm->g_shm_fd == -1 && i >= 0; --i) { + + if (sizes[i] == 0 || map_size % sizes[i]) { continue; } + + shm->g_shm_fd = + shm_create_largepage(shm->g_shm_file_path, shmflags, i, + SHM_LARGEPAGE_ALLOC_DEFAULT, DEFAULT_PERMISSION); + + } + + } + + #endif + /* create the shared memory segment as if it was a file */ - shm->g_shm_fd = shm_open(shm->g_shm_file_path, O_CREAT | O_RDWR | O_EXCL, - DEFAULT_PERMISSION); + if (shm->g_shm_fd == -1) { + + shm->g_shm_fd = + shm_open(shm->g_shm_file_path, shmflags | O_CREAT, DEFAULT_PERMISSION); + + } + if (shm->g_shm_fd == -1) { PFATAL("shm_open() failed"); } /* configure the size of the shared memory segment */ |