summaryrefslogtreecommitdiff
path: root/fuzzers/commit_graph_fuzzer.c
diff options
context:
space:
mode:
authorlhchavez <lhchavez@lhchavez.com>2021-01-04 18:22:43 -0800
committerlhchavez <lhchavez@lhchavez.com>2021-01-10 11:18:38 -0800
commit3fd57a75e9dd0c4b0e40ee6e21568d40bd70d29b (patch)
tree7ba89ed7cea693a3a48c6ab509608ab5175aab76 /fuzzers/commit_graph_fuzzer.c
parentf0d7922c9bafff38e12978625f467aafebe75145 (diff)
downloadlibgit2-3fd57a75e9dd0c4b0e40ee6e21568d40bd70d29b.tar.gz
commit-graph: Introduce a parser for commit-graph files
This change is the first in a series to add support for git's commit-graph. This should speed up commit graph traversals by avoiding object parsing and allowing some operations to terminate earlier. Part of: #5757
Diffstat (limited to 'fuzzers/commit_graph_fuzzer.c')
-rw-r--r--fuzzers/commit_graph_fuzzer.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/fuzzers/commit_graph_fuzzer.c b/fuzzers/commit_graph_fuzzer.c
new file mode 100644
index 000000000..f5b9c8988
--- /dev/null
+++ b/fuzzers/commit_graph_fuzzer.c
@@ -0,0 +1,75 @@
+/*
+ * libgit2 commit-graph fuzzer target.
+ *
+ * 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 "buffer.h"
+#include "common.h"
+#include "futils.h"
+#include "hash.h"
+#include "commit_graph.h"
+
+int LLVMFuzzerInitialize(int *argc, char ***argv)
+{
+ GIT_UNUSED(argc);
+ GIT_UNUSED(argv);
+
+ if (git_libgit2_init() < 0) {
+ fprintf(stderr, "Failed to initialize libgit2\n");
+ abort();
+ }
+ return 0;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ git_commit_graph_file cgraph = {{0}};
+ git_buf commit_graph_buf = GIT_BUF_INIT;
+ git_oid oid = {{0}};
+ bool append_hash = false;
+
+ if (size < 4)
+ return 0;
+
+ /*
+ * If the first byte in the stream has the high bit set, append the
+ * SHA1 hash so that the file is somewhat valid.
+ */
+ append_hash = *data & 0x80;
+ /* Keep a 4-byte alignment to avoid unaligned accesses. */
+ data += 4;
+ size -= 4;
+
+ if (append_hash) {
+ if (git_buf_init(&commit_graph_buf, size + sizeof(oid)) < 0)
+ goto cleanup;
+ if (git_hash_buf(&oid, data, size) < 0) {
+ fprintf(stderr, "Failed to compute the SHA1 hash\n");
+ abort();
+ }
+ memcpy(commit_graph_buf.ptr, data, size);
+ memcpy(commit_graph_buf.ptr + size, &oid, sizeof(oid));
+ } else {
+ git_buf_attach_notowned(&commit_graph_buf, (char *)data, size);
+ }
+
+ if (git_commit_graph_parse(
+ &cgraph,
+ (const unsigned char *)git_buf_cstr(&commit_graph_buf),
+ git_buf_len(&commit_graph_buf))
+ < 0)
+ goto cleanup;
+
+cleanup:
+ git_commit_graph_close(&cgraph);
+ git_buf_dispose(&commit_graph_buf);
+ return 0;
+}