]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule--helper: fix a memory leak in "status"
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 8 Nov 2022 14:10:34 +0000 (15:10 +0100)
committerTaylor Blau <me@ttaylorr.com>
Tue, 8 Nov 2022 19:55:30 +0000 (14:55 -0500)
The "status" sub-command was leaking the "struct strvec" it was
setting up for the reasons explained in f92dbdbc6a8 (revisions API:
don't leak memory on argv elements that need free()-ing, 2022-08-02),
so let's use the "free_removed_argv_elements" option to
setup_revisions() to fix the leak.

Even if we did that, clobbering the "diff_files_args.nr" with the
return value of setup_revisions() would leave leaks in place, but we
can just stop clobbering it.

Ever since that code was added in a9f8a37584a (submodule: port
submodule subcommand 'status' from shell to C, 2017-10-06) we've had
no reason to modify the "nr" member ("argc" at the time): The next use
of "diff_files_args" after this is the "strvec_clear()" at the end of
the function.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
builtin/submodule--helper.c
t/t7422-submodule-output.sh

index 6250b95a6f79843d87c100b69f09c31b97fddf0c..ee6f2d34cbacd99991dfa54a53a4016afb7b268e 100644 (file)
@@ -616,6 +616,9 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
        int diff_files_result;
        struct strbuf buf = STRBUF_INIT;
        const char *git_dir;
+       struct setup_revision_opt opt = {
+               .free_removed_argv_elements = 1,
+       };
 
        if (!submodule_from_path(the_repository, null_oid(), path))
                die(_("no submodule mapping found in .gitmodules for path '%s'"),
@@ -649,9 +652,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
 
        repo_init_revisions(the_repository, &rev, NULL);
        rev.abbrev = 0;
-       diff_files_args.nr = setup_revisions(diff_files_args.nr,
-                                            diff_files_args.v,
-                                            &rev, NULL);
+       setup_revisions(diff_files_args.nr, diff_files_args.v, &rev, &opt);
        diff_files_result = run_diff_files(&rev, 0);
 
        if (!diff_result_code(&rev.diffopt, diff_files_result)) {
index 1e9cdf1a68e458661578ddcbf450e5b1774a07b0..ab946ec9405deb536ffd7c6fa350bcc8abf3544c 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='submodule --cached, --quiet etc. output'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-t3100.sh