summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-07-09 20:37:02 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-07-10 05:38:34 (GMT)
commitf62ce3de9dd4803f50f65e17f5fc03c7bdb49c40 (patch)
tree71829426877be588574a67a084c1649c39eef5c7
parentb9fd284657de3ec30922fb17c0baf243ae947fdd (diff)
downloadgit-f62ce3de9dd4803f50f65e17f5fc03c7bdb49c40.zip
git-f62ce3de9dd4803f50f65e17f5fc03c7bdb49c40.tar.gz
git-f62ce3de9dd4803f50f65e17f5fc03c7bdb49c40.tar.bz2
Make index preloading check the whole path to the file
This uses the new thread-safe 'threaded_has_symlink_leading_path()' function to efficiently verify that the whole path leading up to the filename is a proper path, and does not contain symlinks. This makes 'ce_uptodate()' a much stronger guarantee: it no longer just guarantees that the 'lstat()' of the path would match, it also means that we know that people haven't played games with moving directories around and covered it up with symlinks. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--preload-index.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/preload-index.c b/preload-index.c
index 88edc5f..14d5281 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -34,7 +34,9 @@ static void *preload_thread(void *_data)
struct thread_data *p = _data;
struct index_state *index = p->index;
struct cache_entry **cep = index->cache + p->offset;
+ struct cache_def cache;
+ memset(&cache, 0, sizeof(cache));
nr = p->nr;
if (nr + p->offset > index->cache_nr)
nr = index->cache_nr - p->offset;
@@ -49,6 +51,8 @@ static void *preload_thread(void *_data)
continue;
if (!ce_path_match(ce, p->pathspec))
continue;
+ if (threaded_has_symlink_leading_path(&cache, ce->name, ce_namelen(ce)))
+ continue;
if (lstat(ce->name, &st))
continue;
if (ie_match_stat(index, ce, &st, CE_MATCH_RACY_IS_DIRTY))