summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Barvik <barvik@broadpark.no>2009-06-14 13:08:28 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-07-30 03:20:12 (GMT)
commit77716755cbdf970fa0814a5f77c884b1f17693de (patch)
tree7ea6ab124233dafe0d1d9a894e298fc9a1e51f5c
parent4f6339b0c353b5c03b566b605e50a743d97fc08e (diff)
downloadgit-77716755cbdf970fa0814a5f77c884b1f17693de.zip
git-77716755cbdf970fa0814a5f77c884b1f17693de.tar.gz
git-77716755cbdf970fa0814a5f77c884b1f17693de.tar.bz2
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 <gitster@pobox.com>
-rw-r--r--symlinks.c4
-rwxr-xr-xt/t6035-merge-dir-to-symlink.sh2
2 files changed, 5 insertions, 1 deletions
diff --git a/symlinks.c b/symlinks.c
index 4bdded3..7b0a86d 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 18d5f94..ba90fc5 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 &&