summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-12-15 05:52:02 -0600
committerGitHub <noreply@github.com>2017-12-15 05:52:02 -0600
commit2482559dab65e9d587aa710bee70f72742995fae (patch)
treed3258747d4035690a5ae7fb25c36b6e15a1df21d
parentc342c1313239950b0a324b229851ad0af9252da3 (diff)
parentc8aaba2441315680c60a98c73d538922f5ccd33e (diff)
downloadlibgit2-2482559dab65e9d587aa710bee70f72742995fae.tar.gz
Merge pull request #4432 from lhchavez/fix-missing-trailer
libFuzzer: Fix missing trailer crash
-rw-r--r--src/indexer.c4
-rw-r--r--tests/pack/indexer.c17
2 files changed, 21 insertions, 0 deletions
diff --git a/src/indexer.c b/src/indexer.c
index aedefe523..7eec0d612 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -951,6 +951,10 @@ int git_indexer_commit(git_indexer *idx, git_transfer_progress *stats)
giterr_set(GITERR_INDEXER, "unexpected data at the end of the pack");
return -1;
}
+ if (idx->off + 20 > idx->pack->mwf.size) {
+ giterr_set(GITERR_INDEXER, "missing trailer at the end of the pack");
+ return -1;
+ }
packfile_trailer = git_mwindow_open(&idx->pack->mwf, &w, idx->pack->mwf.size - GIT_OID_RAWSZ, GIT_OID_RAWSZ, &left);
if (packfile_trailer == NULL) {
diff --git a/tests/pack/indexer.c b/tests/pack/indexer.c
index a28ee3e07..4d2d9f60e 100644
--- a/tests/pack/indexer.c
+++ b/tests/pack/indexer.c
@@ -87,6 +87,23 @@ void test_pack_indexer__leaky(void)
git_indexer_free(idx);
}
+void test_pack_indexer__missing_trailer(void)
+{
+ git_indexer *idx = 0;
+ git_transfer_progress stats = { 0 };
+
+ cl_git_pass(git_indexer_new(&idx, ".", 0, NULL, NULL, NULL));
+ /* Truncate a valid packfile */
+ cl_git_pass(git_indexer_append(
+ idx, out_of_order_pack, out_of_order_pack_len - 20, &stats));
+ cl_git_fail(git_indexer_commit(idx, &stats));
+
+ cl_assert(giterr_last() != NULL);
+ cl_assert_equal_i(giterr_last()->klass, GITERR_INDEXER);
+
+ git_indexer_free(idx);
+}
+
void test_pack_indexer__fix_thin(void)
{
git_indexer *idx = NULL;