Browse Source

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>
maint
Jeff King 8 years ago committed by Junio C Hamano
parent
commit
f9b7573f6b
  1. 4
      environment.c
  2. 4
      repository.c

4
environment.c

@ -97,7 +97,7 @@ int ignore_untracked_cache_config; @@ -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) @@ -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)

4
repository.c

@ -40,11 +40,15 @@ static void repo_setup_env(struct repository *repo) @@ -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);
}

Loading…
Cancel
Save