Commit f7fcb18f by Carlos Martín Nieto

Plug leaks

Valgrind is now clean except for libssl and libgcrypt.
parent e06b1040
...@@ -1234,7 +1234,7 @@ int git_diff_tree_to_workdir( ...@@ -1234,7 +1234,7 @@ int git_diff_tree_to_workdir(
assert(diff && repo); assert(diff && repo);
if ((error = git_repository_index(&index, repo))) if ((error = git_repository_index__weakptr(&index, repo)))
return error; return error;
DIFF_FROM_ITERATORS( DIFF_FROM_ITERATORS(
...@@ -1243,7 +1243,6 @@ int git_diff_tree_to_workdir( ...@@ -1243,7 +1243,6 @@ int git_diff_tree_to_workdir(
&b, repo, index, old_tree, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx) &b, repo, index, old_tree, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx)
); );
git_index_free(index);
return error; return error;
} }
......
...@@ -1418,6 +1418,7 @@ static void workdir_iterator__free(git_iterator *self) ...@@ -1418,6 +1418,7 @@ static void workdir_iterator__free(git_iterator *self)
workdir_iterator *wi = (workdir_iterator *)self; workdir_iterator *wi = (workdir_iterator *)self;
if (wi->index) if (wi->index)
git_index_snapshot_release(&wi->index_snapshot, wi->index); git_index_snapshot_release(&wi->index_snapshot, wi->index);
git_tree_free(wi->tree);
fs_iterator__free(self); fs_iterator__free(self);
git_ignore__free(&wi->ignores); git_ignore__free(&wi->ignores);
} }
......
...@@ -995,6 +995,7 @@ static int remote_head_for_ref(git_remote_head **out, git_remote *remote, git_re ...@@ -995,6 +995,7 @@ static int remote_head_for_ref(git_remote_head **out, git_remote *remote, git_re
error = remote_head_for_fetchspec_src(out, update_heads, git_buf_cstr(&remote_name)); error = remote_head_for_fetchspec_src(out, update_heads, git_buf_cstr(&remote_name));
cleanup: cleanup:
git_buf_free(&remote_name);
git_reference_free(resolved_ref); git_reference_free(resolved_ref);
git_config_free(config); git_config_free(config);
return error; return error;
......
...@@ -47,6 +47,17 @@ static void free_head(git_remote_head *head) ...@@ -47,6 +47,17 @@ static void free_head(git_remote_head *head)
git__free(head); git__free(head);
} }
static void free_heads(git_vector *heads)
{
git_remote_head *head;
size_t i;
git_vector_foreach(heads, i, head)
free_head(head);
git_vector_free(heads);
}
static int add_ref(transport_local *t, const char *name) static int add_ref(transport_local *t, const char *name)
{ {
const char peeled[] = "^{}"; const char peeled[] = "^{}";
...@@ -198,6 +209,8 @@ static int local_connect( ...@@ -198,6 +209,8 @@ static int local_connect(
if (t->connected) if (t->connected)
return 0; return 0;
free_heads(&t->refs);
t->url = git__strdup(url); t->url = git__strdup(url);
GITERR_CHECK_ALLOC(t->url); GITERR_CHECK_ALLOC(t->url);
t->direction = direction; t->direction = direction;
...@@ -624,13 +637,8 @@ static int local_close(git_transport *transport) ...@@ -624,13 +637,8 @@ static int local_close(git_transport *transport)
static void local_free(git_transport *transport) static void local_free(git_transport *transport)
{ {
transport_local *t = (transport_local *)transport; transport_local *t = (transport_local *)transport;
size_t i;
git_remote_head *head;
git_vector_foreach(&t->refs, i, head) free_heads(&t->refs);
free_head(head);
git_vector_free(&t->refs);
/* Close the transport, if it's still open. */ /* Close the transport, if it's still open. */
local_close(transport); local_close(transport);
......
...@@ -986,6 +986,7 @@ void test_checkout_tree__removes_conflicts(void) ...@@ -986,6 +986,7 @@ void test_checkout_tree__removes_conflicts(void)
cl_assert(!git_path_exists("testrepo/other.txt")); cl_assert(!git_path_exists("testrepo/other.txt"));
git_commit_free(commit);
git_index_free(index); git_index_free(index);
} }
...@@ -1030,5 +1031,6 @@ void test_checkout_tree__removes_conflicts_only_by_pathscope(void) ...@@ -1030,5 +1031,6 @@ void test_checkout_tree__removes_conflicts_only_by_pathscope(void)
cl_assert(git_path_exists("testrepo/other.txt")); cl_assert(git_path_exists("testrepo/other.txt"));
git_commit_free(commit);
git_index_free(index); git_index_free(index);
} }
...@@ -12,12 +12,9 @@ git_tree *resolve_commit_oid_to_tree( ...@@ -12,12 +12,9 @@ git_tree *resolve_commit_oid_to_tree(
git_tree *tree = NULL; git_tree *tree = NULL;
if (git_oid_fromstrn(&oid, partial_oid, len) == 0) if (git_oid_fromstrn(&oid, partial_oid, len) == 0)
git_object_lookup_prefix(&obj, repo, &oid, len, GIT_OBJ_ANY); cl_git_pass(git_object_lookup_prefix(&obj, repo, &oid, len, GIT_OBJ_ANY));
cl_assert(obj);
if (git_object_type(obj) == GIT_OBJ_TREE) cl_git_pass(git_object_peel((git_object **) &tree, obj, GIT_OBJ_TREE));
return (git_tree *)obj;
cl_assert(git_object_type(obj) == GIT_OBJ_COMMIT);
cl_git_pass(git_commit_tree(&tree, (git_commit *)obj));
git_object_free(obj); git_object_free(obj);
return tree; return tree;
} }
......
...@@ -172,12 +172,14 @@ void test_network_remote_local__tagopt(void) ...@@ -172,12 +172,14 @@ void test_network_remote_local__tagopt(void)
cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL)); cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL));
cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master")); cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master"));
git_reference_free(ref);
cl_git_pass(git_reference_lookup(&ref, repo, "refs/tags/hard_tag")); cl_git_pass(git_reference_lookup(&ref, repo, "refs/tags/hard_tag"));
git_reference_free(ref); git_reference_free(ref);
git_remote_set_autotag(remote, GIT_REMOTE_DOWNLOAD_TAGS_AUTO); git_remote_set_autotag(remote, GIT_REMOTE_DOWNLOAD_TAGS_AUTO);
cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL)); cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL));
cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master")); cl_git_pass(git_reference_lookup(&ref, repo, "refs/remotes/tagopt/master"));
git_reference_free(ref);
} }
void test_network_remote_local__push_to_bare_remote(void) void test_network_remote_local__push_to_bare_remote(void)
......
...@@ -925,6 +925,7 @@ void test_status_ignore__subdir_doesnt_match_above(void) ...@@ -925,6 +925,7 @@ void test_status_ignore__subdir_doesnt_match_above(void)
cl_git_pass(git_repository_config_snapshot(&cfg, g_repo)); cl_git_pass(git_repository_config_snapshot(&cfg, g_repo));
error = git_config_get_bool(&icase, cfg, "core.ignorecase"); error = git_config_get_bool(&icase, cfg, "core.ignorecase");
git_config_free(cfg);
if (error == GIT_ENOTFOUND) if (error == GIT_ENOTFOUND)
error = 0; error = 0;
......
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