summaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c30
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);