tree: fix insertion of entries with invalid filenames

This commit is contained in:
nulltoken 2011-07-13 07:58:17 +02:00
parent e6629d8313
commit f4ad64c109
2 changed files with 10 additions and 3 deletions

View File

@ -379,10 +379,12 @@ int git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld, con
assert(bld && id && filename); assert(bld && id && filename);
if (!valid_attributes(attributes)) if (!valid_attributes(attributes))
return git__throw(GIT_ERROR, "Failed to insert entry. Invalid atrributes"); return git__throw(GIT_ERROR, "Failed to insert entry. Invalid attributes");
if (build_ksearch(&ksearch, filename) == GIT_SUCCESS && if (build_ksearch(&ksearch, filename) < GIT_SUCCESS)
(pos = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch)) != GIT_ENOTFOUND) { return git__throw(GIT_ERROR, "Failed to insert entry. Invalid filename '%s'", filename);
if ((pos = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch)) != GIT_ENOTFOUND) {
entry = git_vector_get(&bld->entries, pos); entry = git_vector_get(&bld->entries, pos);
if (entry->removed) { if (entry->removed) {
entry->removed = 0; entry->removed = 0;

View File

@ -150,6 +150,11 @@ BEGIN_TEST(write2, "write a tree from a memory")
//create a second tree from first tree using `git_treebuilder_insert` on REPOSITORY_FOLDER. //create a second tree from first tree using `git_treebuilder_insert` on REPOSITORY_FOLDER.
must_pass(git_tree_lookup(&tree, repo, &id)); must_pass(git_tree_lookup(&tree, repo, &id));
must_pass(git_treebuilder_create(&builder, tree)); must_pass(git_treebuilder_create(&builder, tree));
must_fail(git_treebuilder_insert(NULL, builder, "", &bid, 0100644));
must_fail(git_treebuilder_insert(NULL, builder, "/", &bid, 0100644));
must_fail(git_treebuilder_insert(NULL, builder, "folder/new.txt", &bid, 0100644));
must_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644)); must_pass(git_treebuilder_insert(NULL,builder,"new.txt",&bid,0100644));
must_pass(git_treebuilder_write(&rid,repo,builder)); must_pass(git_treebuilder_write(&rid,repo,builder));