Commit 3a1f5df87b1be025b21972a592a6d0a75cfa2bb2

Patrick Steinhardt 2018-08-24T09:15:29

tests: verify adding index conflicts with invalid filemodes fails Commit 581d5492f (Fix leak in index.c, 2018-08-16) was fixing a memory leak in our code adding conflicts to the index when the added index entries have an invalid file mode. The memory leak was previously undiscovered as there are no tests covering this scenario, which is now being added by this commit.

diff --git a/tests/index/conflicts.c b/tests/index/conflicts.c
index 367d5b5..27fbe2b 100644
--- a/tests/index/conflicts.c
+++ b/tests/index/conflicts.c
@@ -91,6 +91,48 @@ void test_index_conflicts__add_fixes_incorrect_stage(void)
 	cl_assert(git_index_entry_stage(conflict_entry[2]) == 3);
 }
 
+void test_index_conflicts__add_detects_invalid_filemode(void)
+{
+	git_index_entry ancestor_entry, our_entry, their_entry;
+	git_index_entry *conflict_entry[3];
+	int i;
+
+	cl_assert(git_index_entrycount(repo_index) == 8);
+
+	memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
+	memset(&our_entry, 0x0, sizeof(git_index_entry));
+	memset(&their_entry, 0x0, sizeof(git_index_entry));
+
+	conflict_entry[0] = &ancestor_entry;
+	conflict_entry[1] = &our_entry;
+	conflict_entry[2] = &their_entry;
+
+	for (i = 0; i < 3; i++) {
+		ancestor_entry.path = "test-one.txt";
+		ancestor_entry.mode = 0100644;
+		GIT_IDXENTRY_STAGE_SET(&ancestor_entry, 3);
+		git_oid_fromstr(&ancestor_entry.id, CONFLICTS_ONE_ANCESTOR_OID);
+
+		our_entry.path = "test-one.txt";
+		our_entry.mode = 0100644;
+		GIT_IDXENTRY_STAGE_SET(&our_entry, 1);
+		git_oid_fromstr(&our_entry.id, CONFLICTS_ONE_OUR_OID);
+
+		their_entry.path = "test-one.txt";
+		their_entry.mode = 0100644;
+		GIT_IDXENTRY_STAGE_SET(&their_entry, 2);
+		git_oid_fromstr(&their_entry.id, CONFLICTS_ONE_THEIR_OID);
+
+		/* Corrupt the conflict entry's mode */
+		conflict_entry[i]->mode = 027431745;
+
+		cl_git_fail(git_index_conflict_add(repo_index, &ancestor_entry, &our_entry, &their_entry));
+	}
+
+	cl_assert(git_index_entrycount(repo_index) == 8);
+}
+
+
 void test_index_conflicts__add_removes_stage_zero(void)
 {
 	git_index_entry ancestor_entry, our_entry, their_entry;