From 77716755cbdf970fa0814a5f77c884b1f17693de Mon Sep 17 00:00:00 2001 From: Kjetil Barvik Date: Sun, 14 Jun 2009 15:08:28 +0200 Subject: [PATCH] lstat_cache: guard against full match of length of 'name' parameter longest_path_match() in symlinks.c does exactly what it's name says, but in some cases that match can be too long, since the has_*_leading_path() functions assumes that the match will newer be as long as the name string given to the function. fix this by adding an extra if test which checks if the match length is equal to the 'len' parameter. Signed-off-by: Junio C Hamano --- symlinks.c | 4 ++++ t/t6035-merge-dir-to-symlink.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/symlinks.c b/symlinks.c index 4bdded39c5c5fc..7b0a86d35776e8 100644 --- a/symlinks.c +++ b/symlinks.c @@ -91,6 +91,10 @@ static int lstat_cache(struct cache_def *cache, const char *name, int len, longest_path_match(name, len, cache->path, cache->len, &previous_slash); match_flags = cache->flags & track_flags & (FL_NOENT|FL_SYMLINK); + + if (!(track_flags & FL_FULLPATH) && match_len == len) + match_len = last_slash = previous_slash; + if (match_flags && match_len == cache->len) return match_flags; /* diff --git a/t/t6035-merge-dir-to-symlink.sh b/t/t6035-merge-dir-to-symlink.sh index 18d5f9454bd827..ba90fc53e0447e 100755 --- a/t/t6035-merge-dir-to-symlink.sh +++ b/t/t6035-merge-dir-to-symlink.sh @@ -26,7 +26,7 @@ test_expect_failure 'keep a/b-2/c/d across checkout' ' test -f a/b-2/c/d ' -test_expect_failure 'checkout should not have deleted a/b-2/c/d' ' +test_expect_success 'checkout should not have deleted a/b-2/c/d' ' git checkout HEAD^0 && git reset --hard master && git checkout start^0 &&