v2 fixes the incorrect use of consecutive getenv() and adds a comment to clarify the role of old_gitdir Interdiff: diff --git a/environment.c b/environment.c index 95de419de8..47c6e31559 100644 --- a/environment.c +++ b/environment.c @@ -14,6 +14,7 @@ #include "fmt-merge-msg.h" #include "commit.h" #include "object-store.h" +#include "argv-array.h" int trust_executable_bit = 1; int trust_ctime = 1; @@ -148,18 +149,34 @@ static char *expand_namespace(const char *raw_namespace) return strbuf_detach(&buf, NULL); } +/* Wrapper of getenv() that returns a strdup value. This value is kept + * in argv to be freed later. + */ +static const char *getenv_safe(struct argv_array *argv, const char *name) +{ + const char *value = getenv(name); + + if (!value) + return NULL; + + argv_array_push(argv, value); + return argv->argv[argv->argc - 1]; +} + void setup_git_env(const char *git_dir) { const char *shallow_file; const char *replace_ref_base; struct set_gitdir_args args = { NULL }; + struct argv_array to_free = ARGV_ARRAY_INIT; - args.shared_root = getenv(GIT_COMMON_DIR_ENVIRONMENT); - args.object_dir = getenv(DB_ENVIRONMENT); - args.graft_file = getenv(GRAFT_ENVIRONMENT); - args.index_file = getenv(INDEX_ENVIRONMENT); - args.alternate_db = getenv(ALTERNATE_DB_ENVIRONMENT); + args.shared_root = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT); + args.object_dir = getenv_safe(&to_free, DB_ENVIRONMENT); + args.graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT); + args.index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT); + args.alternate_db = getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT); repo_set_gitdir(the_repository, git_dir, &args); + argv_array_clear(&to_free); if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT)) check_replace_refs = 0; diff --git a/repository.c b/repository.c index 8f6386022f..c555dacad2 100644 --- a/repository.c +++ b/repository.c @@ -48,6 +48,11 @@ void repo_set_gitdir(struct repository *repo, const struct set_gitdir_args *o) { const char *gitfile = read_gitfile(root); + /* + * repo->gitdir is saved because the caller could pass "root" + * that also points to repo->gitdir. We want to keep it alive + * until after xstrdup(root). Then we can free it. + */ char *old_gitdir = repo->gitdir; repo->gitdir = xstrdup(gitfile ? gitfile : root); Nguyễn Thái Ngọc Duy (4): repository.c: move env-related setup code back to environment.c repository.c: delete dead functions sha1_file.c: move delayed getenv(altdb) back to setup_git_env() repository: delete ignore_env member cache.h | 2 +- environment.c | 30 ++++++++++++++++-- object-store.h | 5 ++- object.c | 1 + repository.c | 84 ++++++++++++++++++++++++-------------------------- repository.h | 21 +++++++------ setup.c | 3 +- sha1_file.c | 6 +--- 8 files changed, 86 insertions(+), 66 deletions(-) -- 2.16.1.435.g8f24da2e1a