Skip to content

Commit

Permalink
sanitizers: add *SAN_OPTIONS to the regular envs list
Browse files Browse the repository at this point in the history
  • Loading branch information
robertswiecki committed Dec 27, 2017
1 parent 06008f7 commit 528935c
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 48 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -360,7 +360,7 @@ sanitizers.o: sanitizers.h honggfuzz.h libcommon/util.h libcommon/common.h
sanitizers.o: libcommon/files.h libcommon/common.h libcommon/log.h
subproc.o: subproc.h honggfuzz.h libcommon/util.h arch.h fuzz.h
subproc.o: libcommon/common.h libcommon/files.h libcommon/common.h
subproc.o: libcommon/log.h sanitizers.h
subproc.o: libcommon/log.h
hfuzz_cc/hfuzz-cc.o: honggfuzz.h libcommon/util.h libcommon/common.h
hfuzz_cc/hfuzz-cc.o: libcommon/files.h libcommon/common.h libcommon/log.h
libcommon/files.o: libcommon/files.h libcommon/common.h libcommon/log.h
Expand Down
79 changes: 39 additions & 40 deletions sanitizers.c
Expand Up @@ -110,6 +110,15 @@
*/
#define kSAN_COV_OPTS "coverage=1:coverage_direct=1"

static void sanitizers_AddToEnv(honggfuzz_t* hfuzz, char* env) {
for (size_t i = 0; i < ARRAYSIZE(hfuzz->exe.envs); i++) {
if (hfuzz->exe.envs[i] == NULL) {
hfuzz->exe.envs[i] = env;
break;
}
}
}

bool sanitizers_Init(honggfuzz_t* hfuzz) {
if (hfuzz->linux.pid > 0) {
return true;
Expand All @@ -124,64 +133,54 @@ bool sanitizers_Init(honggfuzz_t* hfuzz) {

/* Address Sanitizer (ASan) */
if (!hfuzz->enableSanitizers) {
snprintf(hfuzz->sanOpts.asanOpts, sizeof(hfuzz->sanOpts.asanOpts), kSAN_REGULAR);
snprintf(
hfuzz->sanOpts.asanOpts, sizeof(hfuzz->sanOpts.asanOpts), "ASAN_OPTIONS=" kSAN_REGULAR);
} else if (hfuzz->useSanCov) {
snprintf(hfuzz->sanOpts.asanOpts, sizeof(hfuzz->sanOpts.asanOpts),
"%s:%s:%s:%s%s/%s:%s%s/%s", kASAN_OPTS, abortFlag, kSAN_COV_OPTS, kSANCOVDIR,
hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
"ASAN_OPTIONS=%s:%s:%s:%s%s/%s:%s%s/%s", kASAN_OPTS, abortFlag, kSAN_COV_OPTS,
kSANCOVDIR, hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
} else {
snprintf(hfuzz->sanOpts.asanOpts, sizeof(hfuzz->sanOpts.asanOpts), "%s:%s:%s%s/%s",
kASAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
snprintf(hfuzz->sanOpts.asanOpts, sizeof(hfuzz->sanOpts.asanOpts),
"ASAN_OPTIONS=%s:%s:%s%s/%s", kASAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
}
LOG_D("ASAN_OPTIONS=%s", hfuzz->sanOpts.asanOpts);
sanitizers_AddToEnv(hfuzz, hfuzz->sanOpts.asanOpts);
LOG_D("%s", hfuzz->sanOpts.asanOpts);

/* Undefined Behavior Sanitizer (UBSan) */
if (!hfuzz->enableSanitizers) {
snprintf(hfuzz->sanOpts.ubsanOpts, sizeof(hfuzz->sanOpts.ubsanOpts), kSAN_REGULAR);
snprintf(hfuzz->sanOpts.ubsanOpts, sizeof(hfuzz->sanOpts.ubsanOpts),
"UBSAN_OPTIONS=" kSAN_REGULAR);
} else if (hfuzz->useSanCov) {
snprintf(hfuzz->sanOpts.ubsanOpts, sizeof(hfuzz->sanOpts.ubsanOpts),
"%s:%s:%s:%s%s/%s:%s%s/%s", kUBSAN_OPTS, abortFlag, kSAN_COV_OPTS, kSANCOVDIR,
hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
"UBSAN_OPTIONS=%s:%s:%s:%s%s/%s:%s%s/%s", kUBSAN_OPTS, abortFlag, kSAN_COV_OPTS,
kSANCOVDIR, hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
} else {
snprintf(hfuzz->sanOpts.ubsanOpts, sizeof(hfuzz->sanOpts.ubsanOpts), "%s:%s:%s%s/%s",
kUBSAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
snprintf(hfuzz->sanOpts.ubsanOpts, sizeof(hfuzz->sanOpts.ubsanOpts),
"UBSAN_OPTIONS=%s:%s:%s%s/%s", kUBSAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
}
LOG_D("UBSAN_OPTIONS=%s", hfuzz->sanOpts.ubsanOpts);
sanitizers_AddToEnv(hfuzz, hfuzz->sanOpts.ubsanOpts);
LOG_D("%s", hfuzz->sanOpts.ubsanOpts);

/* Memory Sanitizer (MSan) */
if (!hfuzz->enableSanitizers) {
snprintf(hfuzz->sanOpts.msanOpts, sizeof(hfuzz->sanOpts.msanOpts), kSAN_REGULAR);
snprintf(
hfuzz->sanOpts.msanOpts, sizeof(hfuzz->sanOpts.msanOpts), "MSAN_OPTIONS=" kSAN_REGULAR);
} else if (hfuzz->useSanCov) {
snprintf(hfuzz->sanOpts.msanOpts, sizeof(hfuzz->sanOpts.msanOpts),
"%s:%s:%s:%s%s/%s:%s%s/%s", kMSAN_OPTS, abortFlag, kSAN_COV_OPTS, kSANCOVDIR,
hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
"MSAN_OPTIONS=%s:%s:%s:%s%s/%s:%s%s/%s", kMSAN_OPTS, abortFlag, kSAN_COV_OPTS,
kSANCOVDIR, hfuzz->io.workDir, _HF_SANCOV_DIR, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
} else {
snprintf(hfuzz->sanOpts.msanOpts, sizeof(hfuzz->sanOpts.msanOpts), "%s:%s:%s%s/%s",
kMSAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir, kLOGPREFIX);
}
LOG_D("MSAN_OPTIONS=%s", hfuzz->sanOpts.msanOpts);

return true;
}

bool sanitizers_prepareExecve(run_t* run) {
/* Address Sanitizer (ASan) */
if (setenv("ASAN_OPTIONS", run->global->sanOpts.asanOpts, 1) == -1) {
PLOG_E("setenv(ASAN_OPTIONS) failed");
return false;
}

/* Memory Sanitizer (MSan) */
if (setenv("MSAN_OPTIONS", run->global->sanOpts.msanOpts, 1) == -1) {
PLOG_E("setenv(MSAN_OPTIONS) failed");
return false;
}

/* Undefined Behavior Sanitizer (UBSan) */
if (setenv("UBSAN_OPTIONS", run->global->sanOpts.ubsanOpts, 1) == -1) {
PLOG_E("setenv(UBSAN_OPTIONS) failed");
return false;
snprintf(hfuzz->sanOpts.msanOpts, sizeof(hfuzz->sanOpts.msanOpts),
"MSAN_OPTIONS=%s:%s:%s%s/%s", kMSAN_OPTS, abortFlag, kSANLOGDIR, hfuzz->io.workDir,
kLOGPREFIX);
}
sanitizers_AddToEnv(hfuzz, hfuzz->sanOpts.msanOpts);
LOG_D("%s", hfuzz->sanOpts.msanOpts);

return true;
}
2 changes: 0 additions & 2 deletions sanitizers.h
Expand Up @@ -33,6 +33,4 @@

extern bool sanitizers_Init(honggfuzz_t* hfuzz);

extern bool sanitizers_prepareExecve(run_t* run);

#endif /* _HF_SANITIZERS_H_ */
5 changes: 0 additions & 5 deletions subproc.c
Expand Up @@ -45,7 +45,6 @@
#include "libcommon/files.h"
#include "libcommon/log.h"
#include "libcommon/util.h"
#include "sanitizers.h"

extern char** environ;

Expand Down Expand Up @@ -200,10 +199,6 @@ bool subproc_PrepareExecv(run_t* run, const char* fileName) {
if (run->global->exe.clearEnv) {
environ = NULL;
}
if (!sanitizers_prepareExecve(run)) {
LOG_E("sanitizers_prepareExecve() failed");
return false;
}
for (size_t i = 0; i < ARRAYSIZE(run->global->exe.envs) && run->global->exe.envs[i]; i++) {
putenv(run->global->exe.envs[i]);
}
Expand Down

0 comments on commit 528935c

Please sign in to comment.