aboutsummaryrefslogtreecommitdiff
path: root/environment.c
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2010-10-02 03:36:52 -0500
committerJunio C Hamano <gitster@pobox.com>2010-10-03 16:50:54 -0700
commit06f3549d7146179c5cafe8f76e8fcbc064eba2f7 (patch)
treec8516c89ed7f5732a15c914fdcfed1e0ae651d12 /environment.c
parent7f7868eadce9b6a9d93e7e8bc80fd58c5e64cc67 (diff)
downloadgit-06f3549d7146179c5cafe8f76e8fcbc064eba2f7.tar.gz
git-06f3549d7146179c5cafe8f76e8fcbc064eba2f7.tar.xz
setup: make sure git dir path is in a permanent buffer
If setup_git_env() is run before the usual repository discovery sequence and .git is a file with the text gitdir: <path> (with <path> any string) then the in-core git_dir variable is set to the result of converting <path> to an absolute path using make_absolute_path(). Unfortunately make_absolute_path() returns its result in a static buffer that is overwritten by later calls. Such a call could cause later accesses to git_dir (from git_pathdup(), for example) to read the wrong path, leaving git very confused. It is not obvious whether any existing code in git will trigger the problem, but in any case, it is worth a few dozen bytes to copy the return value from make_absolute_path() for some added peace of mind. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'environment.c')
-rw-r--r--environment.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/environment.c b/environment.c
index c44a30be3..de5581fe5 100644
--- a/environment.c
+++ b/environment.c
@@ -87,8 +87,10 @@ const char * const local_repo_env[LOCAL_REPO_ENV_SIZE + 1] = {
static void setup_git_env(void)
{
git_dir = getenv(GIT_DIR_ENVIRONMENT);
- if (!git_dir)
+ if (!git_dir) {
git_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT);
+ git_dir = git_dir ? xstrdup(git_dir) : NULL;
+ }
if (!git_dir)
git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
git_object_dir = getenv(DB_ENVIRONMENT);