builtin/grep: fix leak with --max-count=0

When executing with `--max-count=0` we'll return early from git-grep(1)
without performing any cleanup, which causes memory leaks. Plug these.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2024-11-05 07:16:52 +01:00
committed by Junio C Hamano
parent a6590ccdd4
commit 43fedde3df
2 changed files with 11 additions and 3 deletions

View File

@@ -906,6 +906,7 @@ int cmd_grep(int argc,
int dummy; int dummy;
int use_index = 1; int use_index = 1;
int allow_revs; int allow_revs;
int ret;
struct option options[] = { struct option options[] = {
OPT_BOOL(0, "cached", &cached, OPT_BOOL(0, "cached", &cached,
@@ -1172,8 +1173,10 @@ int cmd_grep(int argc,
* Optimize out the case where the amount of matches is limited to zero. * Optimize out the case where the amount of matches is limited to zero.
* We do this to keep results consistent with GNU grep(1). * We do this to keep results consistent with GNU grep(1).
*/ */
if (opt.max_count == 0) if (opt.max_count == 0) {
return 1; ret = 1;
goto out;
}
if (show_in_pager) { if (show_in_pager) {
if (num_threads > 1) if (num_threads > 1)
@@ -1267,10 +1270,14 @@ int cmd_grep(int argc,
hit |= wait_all(); hit |= wait_all();
if (hit && show_in_pager) if (hit && show_in_pager)
run_pager(&opt, prefix); run_pager(&opt, prefix);
ret = !hit;
out:
clear_pathspec(&pathspec); clear_pathspec(&pathspec);
string_list_clear(&path_list, 0); string_list_clear(&path_list, 0);
free_grep_patterns(&opt); free_grep_patterns(&opt);
object_array_clear(&list); object_array_clear(&list);
free_repos(); free_repos();
return !hit; return ret;
} }

View File

@@ -9,6 +9,7 @@ test_description='git grep various.
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_invalid_grep_expression() { test_invalid_grep_expression() {