Commit 323bb88514347ebb7a1d760490384b305f4f4d92

Carlos Martín Nieto 2013-03-04T00:21:56

Fix a few leaks `git_diff_get_patch()` would unconditionally load the patch object and then simply leak it if the user hadn't requested it. Short-circuit loading the object if the user doesn't want it. The rest of the plugs are simply calling the free functions of objects allocated during the tests.

diff --git a/src/diff_output.c b/src/diff_output.c
index 13434be..209a6e0 100644
--- a/src/diff_output.c
+++ b/src/diff_output.c
@@ -1509,6 +1509,10 @@ int git_diff_get_patch(
 	if (git_diff_delta__should_skip(ctxt.opts, delta))
 		return 0;
 
+	/* Don't load the patch if the user doesn't want it */
+	if (!patch_ptr)
+		return 0;
+
 	patch = diff_patch_alloc(&ctxt, delta);
 	if (!patch)
 		return -1;
diff --git a/tests-clar/diff/patch.c b/tests-clar/diff/patch.c
index 77da37d..4d17da4 100644
--- a/tests-clar/diff/patch.c
+++ b/tests-clar/diff/patch.c
@@ -239,6 +239,7 @@ void test_diff_patch__hunks_have_correct_line_numbers(void)
 	git_diff_patch_free(patch);
 	git_diff_list_free(diff);
 	git_tree_free(head);
+	git_config_free(cfg);
 }
 
 static void check_single_patch_stats(
@@ -310,4 +311,5 @@ void test_diff_patch__line_counts_with_eofnl(void)
 	check_single_patch_stats(g_repo, 1, 1, 1);
 
 	git_buf_free(&content);
+	git_config_free(cfg);
 }
diff --git a/tests-clar/diff/rename.c b/tests-clar/diff/rename.c
index 5395125..ae76640 100644
--- a/tests-clar/diff/rename.c
+++ b/tests-clar/diff/rename.c
@@ -274,6 +274,7 @@ void test_diff_rename__not_exact_match(void)
 	cl_assert_equal_i(2, exp.file_status[GIT_DELTA_MODIFIED]);
 	cl_assert_equal_i(2, exp.file_status[GIT_DELTA_ADDED]);
 	cl_assert_equal_i(2, exp.file_status[GIT_DELTA_DELETED]);
+	git_diff_list_free(diff);
 
 	/* git diff -M -C \
 	 *          1c068dee5790ef1580cfc4cd670915b48d790084 \
diff --git a/tests-clar/stash/drop.c b/tests-clar/stash/drop.c
index 1eb42c0..d171390 100644
--- a/tests-clar/stash/drop.c
+++ b/tests-clar/stash/drop.c
@@ -169,4 +169,6 @@ void test_stash_drop__dropping_the_top_stash_updates_the_stash_reference(void)
 
 	cl_assert_equal_i(
 		true, git_oid_cmp(&oid, git_object_id(next_top_stash)) == 0);
+
+	git_object_free(next_top_stash);
 }