aboutsummaryrefslogtreecommitdiff
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
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>
-rw-r--r--environment.c4
-rw-r--r--repository.c4
2 files changed, 7 insertions, 1 deletions
diff --git a/environment.c b/environment.c
index 3fd4b1084..f1f934b6f 100644
--- a/environment.c
+++ b/environment.c
@@ -97,7 +97,7 @@ int ignore_untracked_cache_config;
/* This is set by setup_git_dir_gently() and/or git_default_config() */
char *git_work_tree_cfg;
-static const char *namespace;
+static char *namespace;
static const char *super_prefix;
@@ -152,8 +152,10 @@ void setup_git_env(void)
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
check_replace_refs = 0;
replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
+ free(git_replace_ref_base);
git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
: "refs/replace/");
+ free(namespace);
namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
if (shallow_file)
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);
}