aboutsummaryrefslogtreecommitdiff
path: root/repository.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-09-05 09:04:57 -0400
committerJunio C Hamano <gitster@pobox.com>2017-09-06 18:06:26 +0900
commitf9b7573f6b0039d298de826e22c636db79b9c919 (patch)
tree6335edf95b890d8e4a744e132e2f30a9b5e0df87 /repository.c
parentafbb8838b7d4d1887da1e1871f8e9ccd01ae1138 (diff)
downloadgit-f9b7573f6b0039d298de826e22c636db79b9c919.tar.gz
git-f9b7573f6b0039d298de826e22c636db79b9c919.tar.xz
repository: free fields before overwriting them
It's possible that the repository data may be initialized twice (e.g., after doing a chdir() to the top of the worktree we may have to adjust a relative git_dir path). We should free() any existing fields before assigning to them to avoid leaks. This should be safe, as the fields are set based on the environment or on other strings like the gitdir or commondir. That makes it impossible that we are feeding an alias to the just-freed string. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'repository.c')
-rw-r--r--repository.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/repository.c b/repository.c
index f107af7d7..52f1821c6 100644
--- a/repository.c
+++ b/repository.c
@@ -40,11 +40,15 @@ static void repo_setup_env(struct repository *repo)
repo->different_commondir = find_common_dir(&sb, repo->gitdir,
!repo->ignore_env);
+ free(repo->commondir);
repo->commondir = strbuf_detach(&sb, NULL);
+ free(repo->objectdir);
repo->objectdir = git_path_from_env(DB_ENVIRONMENT, repo->commondir,
"objects", !repo->ignore_env);
+ free(repo->graft_file);
repo->graft_file = git_path_from_env(GRAFT_ENVIRONMENT, repo->commondir,
"info/grafts", !repo->ignore_env);
+ free(repo->index_file);
repo->index_file = git_path_from_env(INDEX_ENVIRONMENT, repo->gitdir,
"index", !repo->ignore_env);
}