summaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-02-23 15:00:27 -0500
committerEdward Thomson <ethomson@github.com>2016-02-28 12:38:40 -0500
commit2bbc7d3e564ed262e9555ea4fd081ece5ceb3bff (patch)
treed874a213c212c247b57cebbb37140f01777bde6f /src/tree.c
parentef63bab306a2a85d15e62bfb73f49ae11f2b5df6 (diff)
downloadlibgit2-2bbc7d3e564ed262e9555ea4fd081ece5ceb3bff.tar.gz
treebuilder: validate tree entries (optionally)
When `GIT_OPT_ENABLE_STRICT_OBJECT_CREATION` is turned on, validate the tree and parent ids given to treebuilder insertion.
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c
index cfceb3f33..2c3151546 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -726,6 +726,18 @@ on_error:
return -1;
}
+static git_otype otype_from_mode(git_filemode_t filemode)
+{
+ switch (filemode) {
+ case GIT_FILEMODE_TREE:
+ return GIT_OBJ_TREE;
+ case GIT_FILEMODE_COMMIT:
+ return GIT_OBJ_COMMIT;
+ default:
+ return GIT_OBJ_BLOB;
+ }
+}
+
int git_treebuilder_insert(
const git_tree_entry **entry_out,
git_treebuilder *bld,
@@ -745,6 +757,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_object__is_valid(bld->repo, id, otype_from_mode(filemode)))
+ return tree_error("Failed to insert entry; invalid object specified", filename);
+
pos = git_strmap_lookup_index(bld->map, filename);
if (git_strmap_valid_index(bld->map, pos)) {
entry = git_strmap_value_at(bld->map, pos);