summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-01-12 08:23:43 +0000
committerPatrick Steinhardt <ps@pks.im>2018-01-26 13:08:40 +0000
commitc0487bde7e3891af7b759a092751294d703fef9d (patch)
tree3e53fa39bf2696b814ac20b42ba17aed8b79db3c
parent71c43065379ecdc523aa0d0c762fd9083fa0f8d9 (diff)
downloadlibgit2-c0487bde7e3891af7b759a092751294d703fef9d.tar.gz
tree: reject writing null-OID entries to a tree
In commit a96d3cc3f (cache-tree: reject entries with null sha1, 2017-04-21), the git.git project has changed its stance on null OIDs in tree objects. Previously, null OIDs were accepted in tree entries to help tools repair broken history. This resulted in some problems though in that many code paths mistakenly passed null OIDs to be added to a tree, which was not properly detected. Align our own code base according to the upstream change and reject writing tree entries early when the OID is all-zero.
-rw-r--r--src/tree.c6
-rw-r--r--tests/object/tree/write.c11
2 files changed, 17 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c
index 75fde2c8f..6a136a6b7 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -498,6 +498,9 @@ static int append_entry(
if (!valid_entry_name(bld->repo, filename))
return tree_error("failed to insert entry: invalid name for a tree entry", filename);
+ if (git_oid_iszero(id))
+ return tree_error("failed to insert entry: invalid null OID for a tree entry", filename);
+
entry = alloc_entry(filename, strlen(filename), id);
GITERR_CHECK_ALLOC(entry);
@@ -740,6 +743,9 @@ int git_treebuilder_insert(
if (!valid_entry_name(bld->repo, filename))
return tree_error("failed to insert entry: invalid name for a tree entry", filename);
+ if (git_oid_iszero(id))
+ return tree_error("failed to insert entry: invalid null OID", filename);
+
if (filemode != GIT_FILEMODE_COMMIT &&
!git_object__is_valid(bld->repo, id, otype_from_mode(filemode)))
return tree_error("failed to insert entry: invalid object specified", filename);
diff --git a/tests/object/tree/write.c b/tests/object/tree/write.c
index a9decf9c1..9690ec4d7 100644
--- a/tests/object/tree/write.c
+++ b/tests/object/tree/write.c
@@ -512,3 +512,14 @@ void test_object_tree_write__object_validity(void)
test_inserting_submodule();
}
+void test_object_tree_write__invalid_null_oid(void)
+{
+ git_treebuilder *bld;
+ git_oid null_oid = {{0}};
+
+ cl_git_pass(git_treebuilder_new(&bld, g_repo, NULL));
+ cl_git_fail(git_treebuilder_insert(NULL, bld, "null_oid_file", &null_oid, GIT_FILEMODE_BLOB));
+ cl_assert(giterr_last() && strstr(giterr_last()->message, "null OID") != NULL);
+
+ git_treebuilder_free(bld);
+}