diff --git a/configure.ac b/configure.ac index 32c2302099f5..f0371828b0cf 100644 --- a/configure.ac +++ b/configure.ac @@ -2624,7 +2624,7 @@ fi AC_ARG_ENABLE(fuzztargets, AS_HELP_STRING([--enable-fuzztargets], [Enable fuzz targets]),[enable_fuzztargets=$enableval],[enable_fuzztargets=no]) AM_CONDITIONAL([BUILD_FUZZTARGETS], [test "x$enable_fuzztargets" = "xyes"]) - AM_CONDITIONAL([RUST_BUILD_STD], [test "x$enable_fuzztargets" = "xyes" && echo "$rust_compiler_version" | grep -q nightly]) + AM_CONDITIONAL([RUST_BUILD_STD], [test "x$enable_fuzztargets" = "xyes" && echo "$rust_compiler_version" | grep -q nightly && echo "$RUSTFLAGS" | grep -v -q coverage]) AC_PROG_CXX AS_IF([test "x$enable_fuzztargets" = "xyes"], [ AS_IF([test "x$CARGO_BUILD_TARGET" = "x" && echo "$rust_compiler_version" | grep -q nightly], [ diff --git a/src/tests/fuzz/onefile.c b/src/tests/fuzz/onefile.c index ef86d921af89..4b3a04bb66ff 100644 --- a/src/tests/fuzz/onefile.c +++ b/src/tests/fuzz/onefile.c @@ -1,25 +1,17 @@ #include #include #include +#include +#include #include "autoconf.h" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); -int main(int argc, char** argv) -{ - FILE * fp; +static int runOneFile(const char *fname) { + //opens the file, get its size, and reads it into a buffer uint8_t *data; size_t size; - - if (argc != 2) { - return 1; - } -#ifdef AFLFUZZ_PERSISTANT_MODE - while (__AFL_LOOP(1000)) { -#endif /* AFLFUZZ_PERSISTANT_MODE */ - - //opens the file, get its size, and reads it into a buffer - fp = fopen(argv[1], "rb"); + FILE *fp = fopen(fname, "rb"); if (fp == NULL) { return 2; } @@ -51,6 +43,48 @@ int main(int argc, char** argv) LLVMFuzzerTestOneInput(data, size); free(data); fclose(fp); + return 0; +} + +int main(int argc, char** argv) +{ + DIR *d; + struct dirent *dir; + int r; + + if (argc != 2) { + return 1; + } +#ifdef AFLFUZZ_PERSISTANT_MODE + while (__AFL_LOOP(1000)) { +#endif /* AFLFUZZ_PERSISTANT_MODE */ + + d = opendir(argv[1]); + if (d == NULL) { + //run one file + r = runOneFile(argv[1]); + if (r != 0) { + return r; + } + } else { + //run every file in one directory + if (chdir(argv[1]) != 0) { + closedir(d); + printf("Invalid directory\n"); + return 2; + } + while((dir = readdir(d)) != NULL) { + if (dir->d_type != DT_REG) { + continue; + } + printf("Running file %s ", dir->d_name); + r = runOneFile(dir->d_name); + if (r != 0) { + return r; + } + } + closedir(d); + } #ifdef AFLFUZZ_PERSISTANT_MODE } #endif /* AFLFUZZ_PERSISTANT_MODE */