summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>2011-07-09 17:38:08 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-07-11 17:52:38 (GMT)
commit7d092adc8f4f54d18f5737c155d5b21e45e81a74 (patch)
treeac23632b036f8f4a3d7c582557480f7bade73e86
parent10c4c881c4d2cb0ece0508e7142e189e68445257 (diff)
downloadgit-7d092adc8f4f54d18f5737c155d5b21e45e81a74.zip
git-7d092adc8f4f54d18f5737c155d5b21e45e81a74.tar.gz
git-7d092adc8f4f54d18f5737c155d5b21e45e81a74.tar.bz2
get_pwd_cwd(): Do not trust st_dev/st_ino blindly
10c4c88 (Allow add_path() to add non-existent directories to the path, 2008-07-21) introduced get_pwd_cwd() function in order to favor $PWD when getenv("PWD") and getcwd() refer to the same directory but are different strings (e.g. the former gives a nicer looking name via a symbolic link to an uglier looking automounted path). The function tried to determine if two directories are the same by running stat(2) on both and comparing ino/dev fields. Unfortunately, stat() does not fill any ino or dev fields in msysgit. But there is a telltale: both ino and dev are 0 when they are not filled correctly, so let's be extra cautious. This happens to fix a bug in "get-receive-pack working_directory/" when the GIT_DIR would not be set correctly due to absolute_path(".") returning the wrong value. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--abspath.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/abspath.c b/abspath.c
index 0d56124..e7d22bf 100644
--- a/abspath.c
+++ b/abspath.c
@@ -77,7 +77,8 @@ static const char *get_pwd_cwd(void)
pwd = getenv("PWD");
if (pwd && strcmp(pwd, cwd)) {
stat(cwd, &cwd_stat);
- if (!stat(pwd, &pwd_stat) &&
+ if ((cwd_stat.st_dev || cwd_stat.st_ino) &&
+ !stat(pwd, &pwd_stat) &&
pwd_stat.st_dev == cwd_stat.st_dev &&
pwd_stat.st_ino == cwd_stat.st_ino) {
strlcpy(cwd, pwd, PATH_MAX);