aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Fioraldi <andreafioraldi@gmail.com>2021-03-01 17:16:34 +0100
committerAndrea Fioraldi <andreafioraldi@gmail.com>2021-03-01 17:16:34 +0100
commita29b360d55026b43989ab653958bfd86fc854927 (patch)
tree55c2d22eba81c516c79f9a0a5b2c5a3ec3c01d59
parent75d6a8b7011699c22e6d7c7ad9869b9a850e053b (diff)
downloadafl++-a29b360d55026b43989ab653958bfd86fc854927.tar.gz
area_is_valid with write
-rw-r--r--instrumentation/afl-compiler-rt.o.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/instrumentation/afl-compiler-rt.o.c b/instrumentation/afl-compiler-rt.o.c
index 1151cd52..15bc823a 100644
--- a/instrumentation/afl-compiler-rt.o.c
+++ b/instrumentation/afl-compiler-rt.o.c
@@ -123,6 +123,10 @@ static u8 is_persistent;
static u8 _is_sancov;
+/* Dummy pipe for area_is_valid() */
+
+static int dummy_pipe;
+
/* ensure we kill the child on termination */
void at_exit(int signal) {
@@ -476,6 +480,11 @@ static void __afl_map_shm(void) {
}
if (id_str) {
+
+ if (pipe(dummy_pipe) < 0) {
+ perror("pipe() failed\n");
+ exit(1);
+ }
#ifdef USEMMAP
const char * shm_file_path = id_str;
@@ -1567,9 +1576,8 @@ static int area_is_valid(void *ptr, size_t len) {
char *p = (char *)ptr;
char *page = (char *)((uintptr_t)p & ~(sysconf(_SC_PAGE_SIZE) - 1));
- int r = syscall(SYS_msync, page, (p - page) + len, MS_ASYNC);
- if (r < 0) return errno != ENOMEM;
- return 1;
+ int r = syscall(dummy_pipe[1], SYS_write, page, (p - page) + len);
+ return errno != EFAULT;
}