aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2021-04-04 15:28:42 +0200
committerGitHub <noreply@github.com>2021-04-04 15:28:42 +0200
commitc23183f1dc39ce0792a879065e6aea33a4c571f8 (patch)
tree68acaf32c888de02334d15814743c1463c564c15 /src
parent53facd8882173873a7b78860b0fb49884de90c5b (diff)
parent99819cf5d1cbc262810f26098a5796c9d1262bc5 (diff)
downloadafl++-c23183f1dc39ce0792a879065e6aea33a4c571f8.tar.gz
Merge pull request #855 from MegaManSec/leak-sanitizer
Add support for standalone leak-sanitizer
Diffstat (limited to 'src')
-rw-r--r--src/afl-analyze.c20
-rw-r--r--src/afl-as.c7
-rw-r--r--src/afl-cc.c10
-rw-r--r--src/afl-forkserver.c19
-rw-r--r--src/afl-fuzz-init.c16
-rw-r--r--src/afl-showmap.c7
-rw-r--r--src/afl-tmin.c19
7 files changed, 89 insertions, 9 deletions
diff --git a/src/afl-analyze.c b/src/afl-analyze.c
index 8e5a1772..7d7519fa 100644
--- a/src/afl-analyze.c
+++ b/src/afl-analyze.c
@@ -784,6 +784,18 @@ static void set_up_environment(char **argv) {
}
+ x = get_afl_env("LSAN_OPTIONS");
+
+ if (x) {
+
+ if (!strstr(x, "symbolize=0")) {
+
+ FATAL("Custom LSAN_OPTIONS set without symbolize=0 - please fix!");
+
+ }
+
+ }
+
setenv("ASAN_OPTIONS",
"abort_on_error=1:"
"detect_leaks=0:"
@@ -821,6 +833,14 @@ static void set_up_environment(char **argv) {
"handle_sigfpe=0:"
"handle_sigill=0", 0);
+ setenv("LSAN_OPTIONS",
+ "exitcode=" STRINGIFY(LSAN_ERROR) ":"
+ "fast_unwind_on_malloc=0:"
+ "symbolize=0:"
+ "print_suppressions=0",
+ 0);
+
+
if (get_afl_env("AFL_PRELOAD")) {
if (qemu_mode) {
diff --git a/src/afl-as.c b/src/afl-as.c
index aebd0ac8..7119d630 100644
--- a/src/afl-as.c
+++ b/src/afl-as.c
@@ -517,11 +517,12 @@ static void add_instrumentation(void) {
} else {
char modeline[100];
- snprintf(modeline, sizeof(modeline), "%s%s%s%s",
+ snprintf(modeline, sizeof(modeline), "%s%s%s%s%s",
getenv("AFL_HARDEN") ? "hardened" : "non-hardened",
getenv("AFL_USE_ASAN") ? ", ASAN" : "",
getenv("AFL_USE_MSAN") ? ", MSAN" : "",
- getenv("AFL_USE_UBSAN") ? ", UBSAN" : "");
+ getenv("AFL_USE_UBSAN") ? ", UBSAN" : "",
+ getenv("AFL_USE_LSAN") ? ", LSAN" : "");
OKF("Instrumented %u locations (%s-bit, %s mode, ratio %u%%).", ins_lines,
use_64bit ? "64" : "32", modeline, inst_ratio);
@@ -585,7 +586,7 @@ int main(int argc, char **argv) {
"AFL_QUIET: suppress verbose output\n"
"AFL_KEEP_ASSEMBLY: leave instrumented assembly files\n"
"AFL_AS_FORCE_INSTRUMENT: force instrumentation for asm sources\n"
- "AFL_HARDEN, AFL_USE_ASAN, AFL_USE_MSAN, AFL_USE_UBSAN:\n"
+ "AFL_HARDEN, AFL_USE_ASAN, AFL_USE_MSAN, AFL_USE_UBSAN, AFL_USE_LSAN:\n"
" used in the instrumentation summary message\n",
argv[0]);
diff --git a/src/afl-cc.c b/src/afl-cc.c
index b354077e..d4c0a6b7 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -819,6 +819,13 @@ static void edit_params(u32 argc, char **argv, char **envp) {
}
+ if (getenv("AFL_USE_LSAN")) {
+ cc_params[cc_par_cnt++] = "-fsanitize=leak";
+ cc_params[cc_par_cnt++] = "-includesanitizer/lsan_interface.h";
+ cc_params[cc_par_cnt++] =
+ "-D__AFL_LEAK_CHECK()=__lsan_do_leak_check()";
+ }
+
if (getenv("AFL_USE_CFISAN")) {
if (!lto_mode) {
@@ -1730,7 +1737,8 @@ int main(int argc, char **argv, char **envp) {
" AFL_USE_ASAN: activate address sanitizer\n"
" AFL_USE_CFISAN: activate control flow sanitizer\n"
" AFL_USE_MSAN: activate memory sanitizer\n"
- " AFL_USE_UBSAN: activate undefined behaviour sanitizer\n");
+ " AFL_USE_UBSAN: activate undefined behaviour sanitizer\n"
+ " AFL_USE_LSAN: activate leak-checker sanitizer\n");
if (have_gcc_plugin)
SAYF(
diff --git a/src/afl-forkserver.c b/src/afl-forkserver.c
index 0037d2d5..cd04e23d 100644
--- a/src/afl-forkserver.c
+++ b/src/afl-forkserver.c
@@ -502,7 +502,7 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
if (!getenv("LD_BIND_LAZY")) { setenv("LD_BIND_NOW", "1", 1); }
- /* Set sane defaults for ASAN if nothing else specified. */
+ /* Set sane defaults for ASAN if nothing else is specified. */
if (!getenv("ASAN_OPTIONS"))
setenv("ASAN_OPTIONS",
@@ -519,7 +519,7 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
"handle_sigill=0",
1);
- /* Set sane defaults for UBSAN if nothing else specified. */
+ /* Set sane defaults for UBSAN if nothing else is specified. */
if (!getenv("UBSAN_OPTIONS"))
setenv("UBSAN_OPTIONS",
@@ -557,6 +557,16 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
"handle_sigill=0",
1);
+ /* LSAN, too, does not support abort_on_error=1. */
+
+ if (!getenv("LSAN_OPTIONS"))
+ setenv("LSAN_OPTIONS",
+ "exitcode=" STRINGIFY(LSAN_ERROR) ":"
+ "fast_unwind_on_malloc=0:"
+ "symbolize=0:"
+ "print_suppressions=0",
+ 1);
+
fsrv->init_child_func(fsrv, argv);
/* Use a distinctive bitmap signature to tell the parent about execv()
@@ -1303,8 +1313,9 @@ fsrv_run_result_t afl_fsrv_run_target(afl_forkserver_t *fsrv, u32 timeout,
if (unlikely(
/* A normal crash/abort */
(WIFSIGNALED(fsrv->child_status)) ||
- /* special handling for msan */
- (fsrv->uses_asan && WEXITSTATUS(fsrv->child_status) == MSAN_ERROR) ||
+ /* special handling for msan and lsan */
+ (fsrv->uses_asan && (WEXITSTATUS(fsrv->child_status) == MSAN_ERROR ||
+ WEXITSTATUS(fsrv->child_status) == LSAN_ERROR)) ||
/* the custom crash_exitcode was returned by the target */
(fsrv->uses_crash_exitcode &&
WEXITSTATUS(fsrv->child_status) == fsrv->crash_exitcode))) {
diff --git a/src/afl-fuzz-init.c b/src/afl-fuzz-init.c
index cb0190a0..48f3289d 100644
--- a/src/afl-fuzz-init.c
+++ b/src/afl-fuzz-init.c
@@ -2490,6 +2490,19 @@ void check_asan_opts(afl_state_t *afl) {
}
+ x = get_afl_env("LSAN_OPTIONS");
+
+ if (x) {
+
+ if (!strstr(x, "symbolize=0")) {
+
+ FATAL("Custom LSAN_OPTIONS set without symbolize=0 - please fix!");
+
+ }
+
+ }
+
+
}
/* Handle stop signal (Ctrl-C, etc). */
@@ -2735,7 +2748,8 @@ void check_binary(afl_state_t *afl, u8 *fname) {
}
if (memmem(f_data, f_len, "__asan_init", 11) ||
- memmem(f_data, f_len, "__msan_init", 11)) {
+ memmem(f_data, f_len, "__msan_init", 11) ||
+ memmem(f_data, f_len, "__lsan_init", 11)) {
afl->fsrv.uses_asan = 1;
diff --git a/src/afl-showmap.c b/src/afl-showmap.c
index 38d03d80..946b19cd 100644
--- a/src/afl-showmap.c
+++ b/src/afl-showmap.c
@@ -572,6 +572,13 @@ static void set_up_environment(afl_forkserver_t *fsrv, char **argv) {
"handle_sigill=0",
0);
+ setenv("LSAN_OPTIONS",
+ "exitcode=" STRINGIFY(LSAN_ERROR) ":"
+ "fast_unwind_on_malloc=0:"
+ "symbolize=0:"
+ "print_suppressions=0",
+ 0);
+
setenv("UBSAN_OPTIONS",
"halt_on_error=1:"
"abort_on_error=1:"
diff --git a/src/afl-tmin.c b/src/afl-tmin.c
index bad5d71b..6aad748c 100644
--- a/src/afl-tmin.c
+++ b/src/afl-tmin.c
@@ -714,6 +714,18 @@ static void set_up_environment(afl_forkserver_t *fsrv, char **argv) {
}
+ x = get_afl_env("LSAN_OPTIONS");
+
+ if (x) {
+
+ if (!strstr(x, "symbolize=0")) {
+
+ FATAL("Custom LSAN_OPTIONS set without symbolize=0 - please fix!");
+
+ }
+
+ }
+
setenv("ASAN_OPTIONS",
"abort_on_error=1:"
"detect_leaks=0:"
@@ -751,6 +763,13 @@ static void set_up_environment(afl_forkserver_t *fsrv, char **argv) {
"handle_sigfpe=0:"
"handle_sigill=0", 0);
+ setenv("LSAN_OPTIONS",
+ "exitcode=" STRINGIFY(LSAN_ERROR) ":"
+ "fast_unwind_on_malloc=0:"
+ "symbolize=0:"
+ "print_suppressions=0",
+ 0);
+
if (get_afl_env("AFL_PRELOAD")) {
if (fsrv->qemu_mode) {