summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2018-01-24 09:30:20 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-01-24 20:40:13 (GMT)
commit2523c4be855af84460e70ab5c8375534f8cefed5 (patch)
treec1867f2356eb89c2c88e286d1c20903e92378f39 /dir.c
parentce0330cad88cdcbb4b151a6dc0064d98757a928e (diff)
downloadgit-2523c4be855af84460e70ab5c8375534f8cefed5.zip
git-2523c4be855af84460e70ab5c8375534f8cefed5.tar.gz
git-2523c4be855af84460e70ab5c8375534f8cefed5.tar.bz2
dir.c: avoid stat() in valid_cached_dir()
stat() may follow a symlink and return stat data of the link's target instead of the link itself. We are concerned about the link itself. It's kind of hard to demonstrate the bug. I think when path->buf is a symlink, we most likely find that its target's stat data does not match our cached one, which means we ignore the cache and fall back to slow path. This is performance issue, not correctness (though we could still catch it by verifying test-dump-untracked-cache. The less unlikely case is, link target stat data matches the cached version and we incorrectly go fast path, ignoring real data on disk. A test for this may involve manipulating stat data, which may be not portable. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/dir.c b/dir.c
index 3c54366..ee1605f 100644
--- a/dir.c
+++ b/dir.c
@@ -1739,7 +1739,7 @@ static int valid_cached_dir(struct dir_struct *dir,
*/
refresh_fsmonitor(istate);
if (!(dir->untracked->use_fsmonitor && untracked->valid)) {
- if (stat(path->len ? path->buf : ".", &st)) {
+ if (lstat(path->len ? path->buf : ".", &st)) {
invalidate_directory(dir->untracked, untracked);
memset(&untracked->stat_data, 0, sizeof(untracked->stat_data));
return 0;