diff options
| author | lhchavez <lhchavez@lhchavez.com> | 2021-01-04 18:22:43 -0800 |
|---|---|---|
| committer | lhchavez <lhchavez@lhchavez.com> | 2021-01-10 11:18:38 -0800 |
| commit | 3fd57a75e9dd0c4b0e40ee6e21568d40bd70d29b (patch) | |
| tree | 7ba89ed7cea693a3a48c6ab509608ab5175aab76 /fuzzers/commit_graph_fuzzer.c | |
| parent | f0d7922c9bafff38e12978625f467aafebe75145 (diff) | |
| download | libgit2-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.c | 75 |
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; +} |
