mirror of
https://github.com/git/git.git
synced 2024-11-24 18:33:43 +08:00
worktree: fix a trivial leak in prune_worktrees()
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>
This commit is contained in:
parent
90428ddccf
commit
9f24f3c719
@ -173,7 +173,7 @@ static void prune_worktrees(void)
|
|||||||
{
|
{
|
||||||
struct strbuf reason = STRBUF_INIT;
|
struct strbuf reason = STRBUF_INIT;
|
||||||
struct strbuf main_path = 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"));
|
DIR *dir = opendir(git_path("worktrees"));
|
||||||
struct dirent *d;
|
struct dirent *d;
|
||||||
if (!dir)
|
if (!dir)
|
||||||
@ -184,14 +184,14 @@ static void prune_worktrees(void)
|
|||||||
if (should_prune_worktree(d->d_name, &reason, &path, expire))
|
if (should_prune_worktree(d->d_name, &reason, &path, expire))
|
||||||
prune_worktree(d->d_name, reason.buf);
|
prune_worktree(d->d_name, reason.buf);
|
||||||
else if (path)
|
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);
|
closedir(dir);
|
||||||
|
|
||||||
strbuf_add_absolute_path(&main_path, get_git_common_dir());
|
strbuf_add_absolute_path(&main_path, get_git_common_dir());
|
||||||
/* massage main worktree absolute path to match 'gitdir' content */
|
/* massage main worktree absolute path to match 'gitdir' content */
|
||||||
strbuf_strip_suffix(&main_path, "/.");
|
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);
|
prune_dups(&kept);
|
||||||
string_list_clear(&kept, 1);
|
string_list_clear(&kept, 1);
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ test_description='prune $GIT_DIR/worktrees'
|
|||||||
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_expect_success initialize '
|
test_expect_success initialize '
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
test_description='test git worktree repair'
|
test_description='test git worktree repair'
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
test_expect_success setup '
|
test_expect_success setup '
|
||||||
|
Loading…
Reference in New Issue
Block a user