Code

lstat_cache: guard against full match of length of 'name' parameter
authorKjetil Barvik <barvik@broadpark.no>
Sun, 14 Jun 2009 13:08:28 +0000 (15:08 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Jul 2009 03:20:12 +0000 (20:20 -0700)
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>
symlinks.c
t/t6035-merge-dir-to-symlink.sh

index 4bdded39c5c5fc491189661bfeca045472970f5b..7b0a86d35776e8695423c13403c9f4fa3465017d 100644 (file)
@@ -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;
                /*
index 18d5f9454bd827a22540d81103ba78c8016ebe7c..ba90fc53e0447e632aa77702f20e793d765da540 100755 (executable)
@@ -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 &&