diff options
author | lhchavez <lhchavez@lhchavez.com> | 2020-02-23 22:28:52 +0000 |
---|---|---|
committer | lhchavez <lhchavez@lhchavez.com> | 2020-10-05 05:08:38 -0700 |
commit | 005e77157d5eef9d9c0765ff201e6ec07e7f5d00 (patch) | |
tree | a65b1b054b394fca1237d5f8c001d21547ffcee1 /fuzzers/midx_fuzzer.c | |
parent | 6d1f19269f6bdce126689535e86819f704f25d1a (diff) | |
download | libgit2-005e77157d5eef9d9c0765ff201e6ec07e7f5d00.tar.gz |
multipack: Introduce a parser for multi-pack-index files
This change is the first in a series to add support for git's
multi-pack-index. This should speed up large repositories significantly.
Part of: #5399
Diffstat (limited to 'fuzzers/midx_fuzzer.c')
-rw-r--r-- | fuzzers/midx_fuzzer.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/fuzzers/midx_fuzzer.c b/fuzzers/midx_fuzzer.c new file mode 100644 index 000000000..e67873faa --- /dev/null +++ b/fuzzers/midx_fuzzer.c @@ -0,0 +1,76 @@ +/* + * libgit2 multi-pack-index 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 "midx.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_midx_file idx = {{0}}; + git_midx_entry e; + git_buf midx_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 packfile 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(&midx_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(midx_buf.ptr, data, size); + memcpy(midx_buf.ptr + size, &oid, sizeof(oid)); + } else { + git_buf_attach_notowned(&midx_buf, (char *)data, size); + } + + if (git_midx_parse(&idx, (const unsigned char *)git_buf_cstr(&midx_buf), git_buf_len(&midx_buf)) < 0) + goto cleanup; + + /* Search for any oid, just to exercise that codepath. */ + if (git_midx_entry_find(&e, &idx, &oid, GIT_OID_HEXSZ) < 0) + goto cleanup; + +cleanup: + git_midx_close(&idx); + git_buf_dispose(&midx_buf); + return 0; +} |