diff options
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/tree.c b/src/tree.c index 6246ff648..57cc95387 100644 --- a/src/tree.c +++ b/src/tree.c @@ -50,14 +50,11 @@ GIT_INLINE(git_filemode_t) normalize_filemode(git_filemode_t filemode) return GIT_FILEMODE_BLOB; } -static int valid_entry_name(const char *filename) +static int valid_entry_name(git_repository *repo, const char *filename) { return *filename != '\0' && - strchr(filename, '/') == NULL && - (*filename != '.' || - (strcmp(filename, ".") != 0 && - strcmp(filename, "..") != 0 && - strcasecmp(filename, DOT_GIT) != 0)); + git_path_isvalid(repo, filename, + GIT_PATH_REJECT_TRAVERSAL | GIT_PATH_REJECT_DOT_GIT | GIT_PATH_REJECT_SLASH); } static int entry_sort_cmp(const void *a, const void *b) @@ -455,7 +452,7 @@ static int append_entry( git_tree_entry *entry; int error = 0; - if (!valid_entry_name(filename)) + if (!valid_entry_name(bld->repo, filename)) return tree_error("Failed to insert entry. Invalid name for a tree entry", filename); entry = alloc_entry(filename); @@ -493,7 +490,7 @@ static int write_tree( return (int)find_next_dir(dirname, index, start); } - if ((error = git_treebuilder_create(&bld, NULL)) < 0 || bld == NULL) + if ((error = git_treebuilder_create(&bld, repo, NULL)) < 0 || bld == NULL) return -1; /* @@ -564,7 +561,7 @@ static int write_tree( } } - if (git_treebuilder_write(oid, repo, bld) < 0) + if (git_treebuilder_write(oid, bld) < 0) goto on_error; git_treebuilder_free(bld); @@ -627,16 +624,21 @@ int git_tree__write_index( return ret; } -int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) +int git_treebuilder_create( + git_treebuilder **builder_p, + git_repository *repo, + const git_tree *source) { git_treebuilder *bld; size_t i; - assert(builder_p); + assert(builder_p && repo); bld = git__calloc(1, sizeof(git_treebuilder)); GITERR_CHECK_ALLOC(bld); + bld->repo = repo; + if (git_strmap_alloc(&bld->map) < 0) { git__free(bld); return -1; @@ -678,7 +680,7 @@ int git_treebuilder_insert( if (!valid_filemode(filemode)) return tree_error("Failed to insert entry. Invalid filemode for file", filename); - if (!valid_entry_name(filename)) + if (!valid_entry_name(bld->repo, filename)) return tree_error("Failed to insert entry. Invalid name for a tree entry", filename); pos = git_strmap_lookup_index(bld->map, filename); @@ -738,7 +740,7 @@ int git_treebuilder_remove(git_treebuilder *bld, const char *filename) return 0; } -int git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *bld) +int git_treebuilder_write(git_oid *oid, git_treebuilder *bld) { int error = 0; size_t i, entrycount; @@ -777,7 +779,7 @@ int git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *b git_vector_free(&entries); if (!error && - !(error = git_repository_odb__weakptr(&odb, repo))) + !(error = git_repository_odb__weakptr(&odb, bld->repo))) error = git_odb_write(oid, odb, tree.ptr, tree.size, GIT_OBJ_TREE); git_buf_free(&tree); |