]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/grep: fix leak with `--max-count=0`
authorPatrick Steinhardt <ps@pks.im>
Tue, 5 Nov 2024 06:16:52 +0000 (07:16 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Nov 2024 06:37:52 +0000 (22:37 -0800)
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>
builtin/grep.c
t/t7810-grep.sh

index f17d46a06e46ba2341fcc484eb308035bf0682ef..98b85c7fcaccc4b22dc2eacce074cdca99999f3d 100644 (file)
@@ -906,6 +906,7 @@ int cmd_grep(int argc,
        int dummy;
        int use_index = 1;
        int allow_revs;
+       int ret;
 
        struct option options[] = {
                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.
         * We do this to keep results consistent with GNU grep(1).
         */
-       if (opt.max_count == 0)
-               return 1;
+       if (opt.max_count == 0) {
+               ret = 1;
+               goto out;
+       }
 
        if (show_in_pager) {
                if (num_threads > 1)
@@ -1267,10 +1270,14 @@ int cmd_grep(int argc,
                hit |= wait_all();
        if (hit && show_in_pager)
                run_pager(&opt, prefix);
+
+       ret = !hit;
+
+out:
        clear_pathspec(&pathspec);
        string_list_clear(&path_list, 0);
        free_grep_patterns(&opt);
        object_array_clear(&list);
        free_repos();
-       return !hit;
+       return ret;
 }
index af2cf2f78ab890662c3743ae407aa6ac101b5d8d..9e7681f083163d698509e7d50b54a9ca6b6a99bc 100755 (executable)
@@ -9,6 +9,7 @@ test_description='git grep various.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_invalid_grep_expression() {