Merge pull request #2169 from libgit2/valgrind Plug leaks
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
diff --git a/src/branch.c b/src/branch.c
index 1ebaf8e..7c88872 100644
--- a/src/branch.c
+++ b/src/branch.c
@@ -66,16 +66,22 @@ int git_branch_create(
assert(branch_name && commit && ref_out);
assert(git_object_owner((const git_object *)commit) == repository);
- if (git_branch_lookup(&branch, repository, branch_name, GIT_BRANCH_LOCAL) == 0) {
- if ((is_head = git_branch_is_head(branch)) < 0) {
- error = is_head;
+
+ if (force && git_branch_lookup(&branch, repository, branch_name, GIT_BRANCH_LOCAL) == 0) {
+ error = git_branch_is_head(branch);
+ git_reference_free(branch);
+ branch = NULL;
+
+ if (error < 0)
goto cleanup;
- }
+
+ is_head = error;
}
if (is_head && force) {
giterr_set(GITERR_REFERENCE, "Cannot force update branch '%s' as it is "
- "the current HEAD of the repository.", git_reference_name(branch));
+ "the current HEAD of the repository.", branch_name);
+ error = -1;
goto cleanup;
}
diff --git a/src/commit.c b/src/commit.c
index 2f5a5b5..255debe 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -455,19 +455,18 @@ int git_commit_nth_gen_ancestor(
assert(ancestor && commit);
- current = (git_commit *)commit;
+ if (git_object_dup((git_object **) ¤t, (git_object *) commit) < 0)
+ return -1;
- if (n == 0)
- return git_commit_lookup(
- ancestor,
- commit->object.repo,
- git_object_id((const git_object *)commit));
+ if (n == 0) {
+ *ancestor = current;
+ return 0;
+ }
while (n--) {
- error = git_commit_parent(&parent, (git_commit *)current, 0);
+ error = git_commit_parent(&parent, current, 0);
- if (current != commit)
- git_commit_free(current);
+ git_commit_free(current);
if (error < 0)
return error;
diff --git a/src/refdb_fs.c b/src/refdb_fs.c
index 3219b05..8a26bec 100644
--- a/src/refdb_fs.c
+++ b/src/refdb_fs.c
@@ -1343,7 +1343,10 @@ static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *
if ((error = retrieve_reflog_path(&path, repo, name)) < 0)
return error;
- return create_new_reflog_file(git_buf_cstr(&path));
+ error = create_new_reflog_file(git_buf_cstr(&path));
+ git_buf_free(&path);
+
+ return error;
}
static int has_reflog(git_repository *repo, const char *name)
diff --git a/src/reset.c b/src/reset.c
index 07fd088..2a78d31 100644
--- a/src/reset.c
+++ b/src/reset.c
@@ -167,6 +167,7 @@ cleanup:
git_object_free(commit);
git_index_free(index);
git_tree_free(tree);
+ git_buf_free(&log_message_buf);
return error;
}
diff --git a/src/transports/local.c b/src/transports/local.c
index 26ada48..f8d511e 100644
--- a/src/transports/local.c
+++ b/src/transports/local.c
@@ -194,6 +194,9 @@ static int local_connect(
GIT_UNUSED(cred_acquire_cb);
GIT_UNUSED(cred_acquire_payload);
+ if (t->connected)
+ return 0;
+
t->url = git__strdup(url);
GITERR_CHECK_ALLOC(t->url);
t->direction = direction;
diff --git a/tests/clone/empty.c b/tests/clone/empty.c
index 78aef7d..8f60710 100644
--- a/tests/clone/empty.c
+++ b/tests/clone/empty.c
@@ -53,11 +53,13 @@ void test_clone_empty__can_clone_an_empty_local_repo_barely(void)
cl_git_pass(git_branch_upstream_name(&buf, g_repo_cloned, local_name));
cl_assert_equal_s(expected_tracked_branch_name, buf.ptr);
+ git_buf_free(&buf);
/* ...and the name of the remote... */
cl_git_pass(git_branch_remote_name(&buf, g_repo_cloned, expected_tracked_branch_name));
cl_assert_equal_s(expected_remote_name, buf.ptr);
+ git_buf_free(&buf);
/* ...even when the remote HEAD is unborn as well */
cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo_cloned,
diff --git a/tests/odb/backend/nobackend.c b/tests/odb/backend/nobackend.c
index 7ed5acc..783641e 100644
--- a/tests/odb/backend/nobackend.c
+++ b/tests/odb/backend/nobackend.c
@@ -18,6 +18,11 @@ void test_odb_backend_nobackend__initialize(void)
git_repository_set_config(_repo, config);
git_repository_set_odb(_repo, odb);
git_repository_set_refdb(_repo, refdb);
+
+ /* The set increases the refcount and we don't want them anymore */
+ git_config_free(config);
+ git_odb_free(odb);
+ git_refdb_free(refdb);
}
void test_odb_backend_nobackend__cleanup(void)
diff --git a/tests/reset/hard.c b/tests/reset/hard.c
index d4c7db4..36120ee 100644
--- a/tests/reset/hard.c
+++ b/tests/reset/hard.c
@@ -212,12 +212,16 @@ void test_reset_hard__reflog_is_correct(void)
reflog_check(repo, "HEAD", 3, "emeric.fermas@gmail.com", exp_msg);
reflog_check(repo, "refs/heads/master", 3, "emeric.fermas@gmail.com", exp_msg);
+ git_object_free(target);
+
/* Moved branch, expect default message */
cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}"));
cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL, NULL));
reflog_check(repo, "HEAD", 3, "emeric.fermas@gmail.com", exp_msg);
reflog_check(repo, "refs/heads/master", 4, NULL, "reset: moving");
+ git_object_free(target);
+
/* Moved branch, expect custom message */
cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}"));
cl_git_pass(git_reset(repo, target, GIT_RESET_HARD, NULL, "message1"));
diff --git a/tests/reset/mixed.c b/tests/reset/mixed.c
index 25272a7..5d8ff63 100644
--- a/tests/reset/mixed.c
+++ b/tests/reset/mixed.c
@@ -61,12 +61,18 @@ void test_reset_mixed__reflog_is_correct(void)
reflog_check(repo, "HEAD", 9, "yoram.harmelin@gmail.com", exp_msg);
reflog_check(repo, "refs/heads/master", 9, "yoram.harmelin@gmail.com", exp_msg);
+ git_object_free(target);
+ target = NULL;
+
/* Moved branch, expect default message */
cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}"));
cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL, NULL));
reflog_check(repo, "HEAD", 9, "yoram.harmelin@gmail.com", exp_msg);
reflog_check(repo, "refs/heads/master", 10, NULL, "reset: moving");
+ git_object_free(target);
+ target = NULL;
+
/* Moved branch, expect custom message */
cl_git_pass(git_revparse_single(&target, repo, "HEAD~^{commit}"));
cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED, NULL, "message1"));