summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Swiecki <robert@swiecki.net>2018-01-10 14:58:44 +0100
committerRobert Swiecki <robert@swiecki.net>2018-01-10 14:58:44 +0100
commit2aeff25712894aa337f6fe30842392762b3b60c7 (patch)
treed7ae3ba5c8e0164cdf9015ffe5c4051aa21e170c
parent9a7539606fdd7165af6196fce2b5a9cb7f0ec117 (diff)
downloadhonggfuzz-2aeff25712894aa337f6fe30842392762b3b60c7.tar.gz
arch: simplify arch handling a bit
-rw-r--r--cmdline.c4
-rw-r--r--honggfuzz.h2
-rw-r--r--linux/arch.c44
-rw-r--r--mac/arch.c19
-rw-r--r--posix/arch.c19
-rw-r--r--subproc.c6
6 files changed, 50 insertions, 44 deletions
diff --git a/cmdline.c b/cmdline.c
index 8cac4f91..566ad07c 100644
--- a/cmdline.c
+++ b/cmdline.c
@@ -205,6 +205,7 @@ bool cmdlineParse(int argc, char* argv[], honggfuzz_t* hfuzz) {
},
.exe =
{
+ .argc = 0,
.cmdline = NULL,
.nullifyStdio = true,
.fuzzStdin = false,
@@ -614,8 +615,9 @@ bool cmdlineParse(int argc, char* argv[], honggfuzz_t* hfuzz) {
if (!logInitLogFile(logfile, ll)) {
return false;
}
+ hfuzz->exe.argc = argc - optind;
hfuzz->exe.cmdline = (const char* const*)&argv[optind];
- if (hfuzz->exe.cmdline[0] == NULL) {
+ if (hfuzz->exe.argc <= 0) {
LOG_E("No fuzz command provided");
cmdlineUsage(argv[0], custom_opts);
return false;
diff --git a/honggfuzz.h b/honggfuzz.h
index d19a8d62..b262d876 100644
--- a/honggfuzz.h
+++ b/honggfuzz.h
@@ -192,6 +192,7 @@ typedef struct {
bool saveUnique;
} io;
struct {
+ int argc;
const char* const* cmdline;
bool nullifyStdio;
bool fuzzStdin;
@@ -285,6 +286,7 @@ typedef struct {
uintptr_t cloneFlags;
bool kernelOnly;
bool useClone;
+ sigset_t waitSigSet;
} linux;
} honggfuzz_t;
diff --git a/linux/arch.c b/linux/arch.c
index 7c915d63..e83a0fd1 100644
--- a/linux/arch.c
+++ b/linux/arch.c
@@ -146,32 +146,32 @@ bool arch_launchChild(run_t* run) {
syscall(__NR_personality, ADDR_NO_RANDOMIZE) == -1) {
PLOG_D("personality(ADDR_NO_RANDOMIZE) failed");
}
+
#define ARGS_MAX 512
const char* args[ARGS_MAX + 2];
- char argData[PATH_MAX] = {0};
+ char argData[PATH_MAX];
int x = 0;
- for (x = 0; x < ARGS_MAX && run->global->exe.cmdline[x]; x++) {
- if (!run->global->exe.fuzzStdin && !run->global->persistent &&
- strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER) == 0) {
+ for (x = 0; x < ARGS_MAX && x < run->global->exe.argc; x++) {
+ if (run->global->persistent || run->global->exe.fuzzStdin) {
+ args[x] = run->global->exe.cmdline[x];
+ } else if (!strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
args[x] = (char*)run->fileName;
- } else if (!run->global->exe.fuzzStdin && !run->global->persistent &&
- strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
+ } else if (strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
const char* off = strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER);
- snprintf(argData, PATH_MAX, "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
+ snprintf(argData, sizeof(argData), "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
run->global->exe.cmdline[x], run->fileName);
args[x] = argData;
} else {
args[x] = run->global->exe.cmdline[x];
}
}
-
args[x++] = NULL;
LOG_D("Launching '%s' on file '%s'", args[0],
run->global->persistent ? "PERSISTENT_MODE" : run->fileName);
- /* alarm persists across forks, so disable it here */
+ /* alarms persist across execve(), so disable it here */
alarm(0);
/* Wait for the ptrace to attach, if this is not a persistent fuzzing session */
@@ -321,14 +321,13 @@ static bool arch_checkWait(run_t* run) {
}
}
-__thread sigset_t sset_io_chld;
void arch_reapChild(run_t* run) {
- static const struct timespec ts = {
- .tv_sec = 0L,
- .tv_nsec = 250000000L,
- };
for (;;) {
- int sig = sigtimedwait(&sset_io_chld, NULL, &ts);
+ static const struct timespec ts = {
+ .tv_sec = 0L,
+ .tv_nsec = 250000000L,
+ };
+ int sig = sigtimedwait(&run->global->linux.waitSigSet, NULL, &ts);
if (sig == -1 && (errno != EAGAIN && errno != EINTR)) {
PLOG_F("sigtimedwait(SIGIO|SIGCHLD, 0.25s)");
}
@@ -382,8 +381,17 @@ bool arch_archInit(honggfuzz_t* hfuzz) {
return false;
}
- __attribute__((weak)) const char* gnu_get_libc_version(void);
+ /*
+ * Set the bitmask (once) of interesting signals, that this thread will be waiting for
+ * (with sigsuspend). Do it once here, to save precious CPU cycles, as this cannot be
+ * a statically initialized const variable
+ */
+ sigemptyset(&hfuzz->linux.waitSigSet);
+ sigaddset(&hfuzz->linux.waitSigSet, SIGIO);
+ sigaddset(&hfuzz->linux.waitSigSet, SIGCHLD);
+
for (;;) {
+ __attribute__((weak)) const char* gnu_get_libc_version(void);
if (!gnu_get_libc_version) {
LOG_W("Unknown libc implementation. Using clone() instead of fork()");
break;
@@ -525,9 +533,5 @@ bool arch_archThreadInit(run_t* run) {
run->linux.cpuBranchFd = -1;
run->linux.cpuIptBtsFd = -1;
- sigemptyset(&sset_io_chld);
- sigaddset(&sset_io_chld, SIGIO);
- sigaddset(&sset_io_chld, SIGCHLD);
-
return true;
}
diff --git a/mac/arch.c b/mac/arch.c
index 4c5362fa..364f5a90 100644
--- a/mac/arch.c
+++ b/mac/arch.c
@@ -298,24 +298,23 @@ pid_t arch_fork(run_t* run HF_ATTR_UNUSED) { return fork(); }
bool arch_launchChild(run_t* run) {
#define ARGS_MAX 512
const char* args[ARGS_MAX + 2];
- char argData[PATH_MAX] = {0};
- int x;
+ char argData[PATH_MAX];
- for (x = 0; x < ARGS_MAX && run->global->exe.cmdline[x]; x++) {
- if (!run->global->exe.fuzzStdin &&
- strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER) == 0) {
- args[x] = run->fileName;
- } else if (!run->global->exe.fuzzStdin &&
- strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
+ int x;
+ for (x = 0; x < ARGS_MAX && x < run->global->exe.argc; x++) {
+ if (run->global->persistent || run->global->exe.fuzzStdin) {
+ args[x] = run->global->exe.cmdline[x];
+ } else if (!strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
+ args[x] = (char*)run->fileName;
+ } else if (strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
const char* off = strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER);
- snprintf(argData, PATH_MAX, "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
+ snprintf(argData, sizeof(argData), "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
run->global->exe.cmdline[x], run->fileName);
args[x] = argData;
} else {
args[x] = run->global->exe.cmdline[x];
}
}
-
args[x++] = NULL;
LOG_D("Launching '%s' on file '%s'", args[0], run->fileName);
diff --git a/posix/arch.c b/posix/arch.c
index 1de289b8..57868180 100644
--- a/posix/arch.c
+++ b/posix/arch.c
@@ -150,24 +150,23 @@ pid_t arch_fork(run_t* fuzzer HF_ATTR_UNUSED) { return fork(); }
bool arch_launchChild(run_t* run) {
#define ARGS_MAX 512
const char* args[ARGS_MAX + 2];
- char argData[PATH_MAX] = {0};
- int x;
+ char argData[PATH_MAX];
- for (x = 0; x < ARGS_MAX && run->global->exe.cmdline[x]; x++) {
- if (!run->global->exe.fuzzStdin &&
- strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER) == 0) {
- args[x] = run->fileName;
- } else if (!run->global->exe.fuzzStdin &&
- strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
+ int x;
+ for (x = 0; x < ARGS_MAX && x < run->global->exe.argc; x++) {
+ if (run->global->persistent || run->global->exe.fuzzStdin) {
+ args[x] = run->global->exe.cmdline[x];
+ } else if (!strcmp(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
+ args[x] = (char*)run->fileName;
+ } else if (strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER)) {
const char* off = strstr(run->global->exe.cmdline[x], _HF_FILE_PLACEHOLDER);
- snprintf(argData, PATH_MAX, "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
+ snprintf(argData, sizeof(argData), "%.*s%s", (int)(off - run->global->exe.cmdline[x]),
run->global->exe.cmdline[x], run->fileName);
args[x] = argData;
} else {
args[x] = run->global->exe.cmdline[x];
}
}
-
args[x++] = NULL;
LOG_D("Launching '%s' on file '%s'", args[0], run->fileName);
diff --git a/subproc.c b/subproc.c
index 7c330f5a..8d06eada 100644
--- a/subproc.c
+++ b/subproc.c
@@ -215,13 +215,13 @@ static bool subproc_PrepareExecv(run_t* run) {
if (run->global->bbFd != -1) {
if (dup2(run->global->bbFd, _HF_BITMAP_FD) == -1) {
- PLOG_F("dup2('%d', %d)", run->global->bbFd, _HF_BITMAP_FD);
+ PLOG_E("dup2('%d', %d)", run->global->bbFd, _HF_BITMAP_FD);
+ return false;
}
- close(run->global->bbFd);
}
if (dup2(run->dynamicFileFd, _HF_INPUT_FD) == -1) {
- PLOG_F("dup2('%d', %d)", run->dynamicFileFd, _HF_INPUT_FD);
+ PLOG_E("dup2('%d', %d)", run->dynamicFileFd, _HF_INPUT_FD);
}
sigset_t sset;