summaryrefslogtreecommitdiffstats
path: root/fuzzers/standalone_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'fuzzers/standalone_driver.c')
-rw-r--r--fuzzers/standalone_driver.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/fuzzers/standalone_driver.c b/fuzzers/standalone_driver.c
new file mode 100644
index 0000000..cd4f717
--- /dev/null
+++ b/fuzzers/standalone_driver.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#include <stdio.h>
+
+#include "git2.h"
+#include "futils.h"
+#include "path.h"
+
+#include "standalone_driver.h"
+
+static int run_one_file(const char *filename)
+{
+ git_str buf = GIT_STR_INIT;
+ int error = 0;
+
+ if (git_futils_readbuffer(&buf, filename) < 0) {
+ fprintf(stderr, "Failed to read %s: %s\n", filename, git_error_last()->message);
+ error = -1;
+ goto exit;
+ }
+
+ LLVMFuzzerTestOneInput((const unsigned char *)buf.ptr, buf.size);
+exit:
+ git_str_dispose(&buf);
+ return error;
+}
+
+int main(int argc, char **argv)
+{
+ git_vector corpus_files = GIT_VECTOR_INIT;
+ char *filename = NULL;
+ unsigned i = 0;
+ int error = 0;
+
+ if (git_libgit2_init() < 0) {
+ fprintf(stderr, "Failed to initialize libgit2\n");
+ abort();
+ }
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <corpus directory>\n", argv[0]);
+ error = -1;
+ goto exit;
+ }
+
+ fprintf(stderr, "Running %s against %s\n", argv[0], argv[1]);
+ LLVMFuzzerInitialize(&argc, &argv);
+
+ if (git_fs_path_dirload(&corpus_files, argv[1], 0, 0x0) < 0) {
+ fprintf(stderr, "Failed to scan corpus directory '%s': %s\n",
+ argv[1], git_error_last()->message);
+ error = -1;
+ goto exit;
+ }
+ git_vector_foreach(&corpus_files, i, filename) {
+ fprintf(stderr, "\tRunning %s...\n", filename);
+ if (run_one_file(filename) < 0) {
+ error = -1;
+ goto exit;
+ }
+ }
+ fprintf(stderr, "Done %d runs\n", i);
+
+exit:
+ git_vector_free_deep(&corpus_files);
+ git_libgit2_shutdown();
+ return error;
+}