diff options
author | Edward Thomson <ethomson@github.com> | 2016-02-23 15:00:27 -0500 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-02-28 12:38:40 -0500 |
commit | 2bbc7d3e564ed262e9555ea4fd081ece5ceb3bff (patch) | |
tree | d874a213c212c247b57cebbb37140f01777bde6f /src/tree.c | |
parent | ef63bab306a2a85d15e62bfb73f49ae11f2b5df6 (diff) | |
download | libgit2-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.c | 15 |
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); |