Commit 03d88ed4 by Vicent Martí

Merge pull request #346 from belkiss/development

Fix memory leak when wrong object type is looked up from cache
parents 80de9ae0 7d3ec3ca
...@@ -117,7 +117,10 @@ int git_object_lookup_prefix(git_object **object_out, git_repository *repo, cons ...@@ -117,7 +117,10 @@ int git_object_lookup_prefix(git_object **object_out, git_repository *repo, cons
object = git_cache_get(&repo->objects, id); object = git_cache_get(&repo->objects, id);
if (object != NULL) { if (object != NULL) {
if (type != GIT_OBJ_ANY && type != object->type) if (type != GIT_OBJ_ANY && type != object->type)
{
git_object_close(object);
return git__throw(GIT_EINVALIDTYPE, "Failed to lookup object. The given type does not match the type on the ODB"); return git__throw(GIT_EINVALIDTYPE, "Failed to lookup object. The given type does not match the type on the ODB");
}
*object_out = object; *object_out = object;
return GIT_SUCCESS; return GIT_SUCCESS;
......
...@@ -104,9 +104,11 @@ BEGIN_TEST(read1, "read a tree from the repository") ...@@ -104,9 +104,11 @@ BEGIN_TEST(read1, "read a tree from the repository")
/* GH-86: git_object_lookup() should also check the type if the object comes from the cache */ /* GH-86: git_object_lookup() should also check the type if the object comes from the cache */
must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_TREE) == 0); must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_TREE) == 0);
must_be_true(obj != NULL);
git_object_close(obj); git_object_close(obj);
obj = NULL;
must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_BLOB) == GIT_EINVALIDTYPE); must_be_true(git_object_lookup(&obj, repo, &id, GIT_OBJ_BLOB) == GIT_EINVALIDTYPE);
git_object_close(obj); must_be_true(obj == NULL);
entry = git_tree_entry_byname(tree, "README"); entry = git_tree_entry_byname(tree, "README");
must_be_true(entry != NULL); must_be_true(entry != NULL);
...@@ -114,6 +116,7 @@ BEGIN_TEST(read1, "read a tree from the repository") ...@@ -114,6 +116,7 @@ BEGIN_TEST(read1, "read a tree from the repository")
must_be_true(strcmp(git_tree_entry_name(entry), "README") == 0); must_be_true(strcmp(git_tree_entry_name(entry), "README") == 0);
must_pass(git_tree_entry_2object(&obj, repo, entry)); must_pass(git_tree_entry_2object(&obj, repo, entry));
must_be_true(obj != NULL);
git_object_close(obj); git_object_close(obj);
git_tree_close(tree); git_tree_close(tree);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment