diff options
author | Vicent Marti <vicent@github.com> | 2014-03-07 16:26:51 +0100 |
---|---|---|
committer | Vicent Marti <vicent@github.com> | 2014-03-07 16:26:51 +0100 |
commit | 0d95f6ec764e6f709eb44b42b4e4e523abf51824 (patch) | |
tree | 7ac45d3d7598966459e5fcb57e05fe790564cef5 | |
parent | c81e4adfd779a5bf8dd91539dda2dc0636abfc9d (diff) | |
parent | ae32c54e5806cf8517beeb057cf640ed346508eb (diff) | |
download | libgit2-0d95f6ec764e6f709eb44b42b4e4e523abf51824.tar.gz |
Merge pull request #2169 from libgit2/valgrind
Plug leaks
-rw-r--r-- | src/branch.c | 16 | ||||
-rw-r--r-- | src/commit.c | 17 | ||||
-rw-r--r-- | src/refdb_fs.c | 5 | ||||
-rw-r--r-- | src/reset.c | 1 | ||||
-rw-r--r-- | src/transports/local.c | 3 | ||||
-rw-r--r-- | tests/clone/empty.c | 2 | ||||
-rw-r--r-- | tests/odb/backend/nobackend.c | 5 | ||||
-rw-r--r-- | tests/reset/hard.c | 4 | ||||
-rw-r--r-- | tests/reset/mixed.c | 6 |
9 files changed, 44 insertions, 15 deletions
diff --git a/src/branch.c b/src/branch.c index 1ebaf8e24..7c888729d 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 2f5a5b51e..255debe82 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 3219b0519..8a26bec0b 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 07fd08863..2a78d312c 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 26ada48e6..f8d511ed6 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 78aef7dae..8f6071096 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 7ed5acced..783641e8f 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 d4c7db45f..36120ee63 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 25272a75c..5d8ff63b4 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")); |