]> git.ipfire.org Git - thirdparty/git.git/commitdiff
worktree: fix a trivial leak in prune_worktrees()
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 6 Feb 2023 23:07:43 +0000 (00:07 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Feb 2023 23:34:38 +0000 (15:34 -0800)
We were leaking both the "struct strbuf" in prune_worktrees(), as well
as the "path" we got from should_prune_worktree(). Since these were
the only two uses of the "struct string_list" let's change it to a
"DUP" and push these to it with "string_list_append_nodup()".

For the string_list_append_nodup() we could also string_list_append()
the main_path.buf, and then strbuf_release(&main_path) right away. But
doing it this way avoids an allocation, as we already have the "struct
strbuf" prepared for appending to "kept".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c
t/t2401-worktree-prune.sh
t/t2406-worktree-repair.sh

index f51c40f1e1edb35942c5af3546cfa483873f22b7..254283aa6f5716ab2ab83a477972b4630c056b1b 100644 (file)
@@ -173,7 +173,7 @@ static void prune_worktrees(void)
 {
        struct strbuf reason = STRBUF_INIT;
        struct strbuf main_path = STRBUF_INIT;
-       struct string_list kept = STRING_LIST_INIT_NODUP;
+       struct string_list kept = STRING_LIST_INIT_DUP;
        DIR *dir = opendir(git_path("worktrees"));
        struct dirent *d;
        if (!dir)
@@ -184,14 +184,14 @@ static void prune_worktrees(void)
                if (should_prune_worktree(d->d_name, &reason, &path, expire))
                        prune_worktree(d->d_name, reason.buf);
                else if (path)
-                       string_list_append(&kept, path)->util = xstrdup(d->d_name);
+                       string_list_append_nodup(&kept, path)->util = xstrdup(d->d_name);
        }
        closedir(dir);
 
        strbuf_add_absolute_path(&main_path, get_git_common_dir());
        /* massage main worktree absolute path to match 'gitdir' content */
        strbuf_strip_suffix(&main_path, "/.");
-       string_list_append(&kept, strbuf_detach(&main_path, NULL));
+       string_list_append_nodup(&kept, strbuf_detach(&main_path, NULL));
        prune_dups(&kept);
        string_list_clear(&kept, 1);
 
index 3d28c7f06b2c8717e31fae23d37fda0acc008a48..568a47ec4268778052534d93a168361744215efa 100755 (executable)
@@ -5,6 +5,7 @@ test_description='prune $GIT_DIR/worktrees'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success initialize '
index 5c44453e1c13322e1fcf30d2facac3c2942a274e..8970780efccd85f54c1e1bd830f841d34ce90ce8 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='test git worktree repair'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '