git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/5] dir.c: avoid stat() in valid_cached_dir()

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Jan 3, 2018, 20:49 UTC
Message-ID
<20180103204928.3769-3-avarab@gmail.com>
In-Reply-To
<20180103204928.3769-1-avarab@gmail.com>
From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>

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>
---
 dir.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dir.c b/dir.c
index 7c4b45e30e..edcb7bb462 100644
--- a/dir.c
+++ b/dir.c
@@ -1809,7 +1809,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;
-- 
2.15.1.424.g9478a66081
Previous: Duy NguyenNext: Ævar Arnfjörð Bjarmason
Message 11 of 13 in “dir.c: avoid stat() in valid_cached_dir()”
  1. dir.c: avoid stat() in valid_cached_dir()Nguyễn Thái Ngọc Duy, Dec 28, 2017
  2. Junio C HamanoDec 28, 2017
  3. Junio C HamanoDec 28, 2017
  4. Duy NguyenJan 1, 2018
  5. 0/5 untracked cache bug fixesÆvar Arnfjörð Bjarmason, Jan 3, 2018
  6. 1/5 status: add a failing test showing a core.untrackedCache bugÆvar Arnfjörð Bjarmason, Jan 3, 2018
  7. 3/5 dir.c: fix missing dir invalidation in untracked codeÆvar Arnfjörð Bjarmason, Jan 3, 2018
  8. 4/5 update-index doc: note a fixed bug in the untracked cacheÆvar Arnfjörð Bjarmason, Jan 3, 2018
  9. 5/5 dir.c: stop ignoring opendir() error in open_cached_dir()Ævar Arnfjörð Bjarmason, Jan 3, 2018
  10. Duy NguyenJan 7, 2018
  11. 2/5 dir.c: avoid stat() in valid_cached_dir()Ævar Arnfjörð Bjarmason, Jan 3, 2018
  12. Ævar Arnfjörð BjarmasonDec 28, 2017
  13. Duy NguyenJan 2, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.