From: Mark Andrews Date: Fri, 14 Aug 2020 03:45:44 +0000 (+1000) Subject: Add the ability to specify an input file X-Git-Tag: v9.17.5~43^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e748ba397c27272ee0ed32a36085d62339449bc;p=thirdparty%2Fbind9.git Add the ability to specify an input file --- diff --git a/fuzz/main.c b/fuzz/main.c index d95d6f3fca6..a9f87a274e1 100644 --- a/fuzz/main.c +++ b/fuzz/main.c @@ -24,6 +24,48 @@ #include +static void +test_one_file(const char *filename) { + int fd; + struct stat st; + char *data; + ssize_t n; + + if ((fd = open(filename, O_RDONLY)) == -1) { + fprintf(stderr, "Failed to open %s: %s\n", filename, + strerror(errno)); + return; + } + + if (fstat(fd, &st) != 0) { + fprintf(stderr, "Failed to stat %s: %s\n", filename, + strerror(errno)); + goto closefd; + } + + data = malloc(st.st_size); + n = read(fd, data, st.st_size); + if (n == st.st_size) { + printf("testing %zd bytes from %s\n", n, filename); + fflush(stdout); + LLVMFuzzerTestOneInput((const uint8_t *)data, n); + fflush(stderr); + } else { + if (n < 0) { + fprintf(stderr, + "Failed to read %zd bytes from %s: %s\n", + (ssize_t)st.st_size, filename, strerror(errno)); + } else { + fprintf(stderr, + "Failed to read %zd bytes from %s, got %zd\n", + (ssize_t)st.st_size, filename, n); + } + } + free(data); +closefd: + close(fd); +} + static void test_all_from(const char *dirname) { DIR *dirp; @@ -36,53 +78,13 @@ test_all_from(const char *dirname) { while ((dp = readdir(dirp)) != NULL) { char filename[strlen(dirname) + strlen(dp->d_name) + 2]; - int fd; - struct stat st; - char *data; - ssize_t n; if (dp->d_name[0] == '.') { continue; } snprintf(filename, sizeof(filename), "%s/%s", dirname, dp->d_name); - - if ((fd = open(filename, O_RDONLY)) == -1) { - fprintf(stderr, "Failed to open %s: %s\n", filename, - strerror(errno)); - continue; - } - - if (fstat(fd, &st) != 0) { - fprintf(stderr, "Failed to stat %s: %s\n", filename, - strerror(errno)); - goto closefd; - } - - data = malloc(st.st_size); - n = read(fd, data, st.st_size); - if (n == st.st_size) { - printf("testing %zd bytes from %s\n", n, filename); - fflush(stdout); - LLVMFuzzerTestOneInput((const uint8_t *)data, n); - fflush(stderr); - } else { - if (n < 0) { - fprintf(stderr, - "Failed to read %zd bytes from %s: " - "%s\n", - (ssize_t)st.st_size, filename, - strerror(errno)); - } else { - fprintf(stderr, - "Failed to read %zd bytes from %s" - ", got %zd\n", - (ssize_t)st.st_size, filename, n); - } - } - free(data); - closefd: - close(fd); + test_one_file(filename); } closedir(dirp); @@ -95,11 +97,20 @@ main(int argc, char **argv) { (void)LLVMFuzzerInitialize(&argc, &argv); - UNUSED(argc); - UNUSED(argv); - - if (argc != 1) { + if (argv[1] != NULL && strcmp(argv[1], "-d") == 0) { debug = true; + argv++; + argc--; + } + + if (argv[1] != NULL) { + while (argv[1] != NULL) { + test_one_file(argv[1]); + argv++; + argc--; + } + POST(argc); + return (0); } target = (target != NULL) ? target + 1 : argv[0];