Skip to content

Commit

Permalink
t7450: test .gitmodules symlink matching against obscured names
Browse files Browse the repository at this point in the history
In t7450 we check that both verify_path() and fsck catch malformed
.gitmodules entries in trees. However, we don't check that we catch
filesystem-equivalent forms of these (e.g., ".GITMOD~1" on Windows).
Our name-matching functions are exercised well in t0060, but there's
nothing to test that we correctly call the matching functions from the
actual fsck and verify_path() code.

So instead of testing just .gitmodules, let's repeat our tests for a few
basic cases. We don't need to be exhaustive here (t0060 handles that),
but just make sure we hit one name of each type.

Besides pushing the tests into a function that takes the path as a
parameter, we'll need to do a few things:

  - adjust the directory name to accommodate the tests running multiple
    times

  - set core.protecthfs for index checks. Fsck always protects all types
    by default, but we want to be able to exercise the HFS routines on
    every system. Note that core.protectntfs is already the default
    these days, but it doesn't hurt to explicitly label our need for it.

  - we'll also take the filename ("gitmodules") as a parameter. All
    calls use the same name for now, but a future patch will extend this
    to handle other .gitfoo files. Note that our fake-content symlink
    destination is somewhat .gitmodules specific. But it isn't necessary
    for other files (which don't do a content check). And it happens to
    be a valid attribute and ignore file anyway.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
peff authored and gitster committed May 4, 2021
1 parent a1ca398 commit 1cb12f3
Showing 1 changed file with 53 additions and 38 deletions.
91 changes: 53 additions & 38 deletions t/t7450-bad-git-dotfiles.sh
Original file line number Diff line number Diff line change
Expand Up @@ -139,44 +139,59 @@ test_expect_success 'index-pack --strict works for non-repo pack' '
grep gitmodulesName output
'

test_expect_success 'set up repo with symlinked .gitmodules file' '
git init symlink &&
(
cd symlink &&
# Make the tree directly to avoid index restrictions.
#
# Because symlinks store the target as a blob, choose
# a pathname that could be parsed as a .gitmodules file
# to trick naive non-symlink-aware checking.
tricky="[foo]bar=true" &&
content=$(git hash-object -w ../.gitmodules) &&
target=$(printf "$tricky" | git hash-object -w --stdin) &&
{
printf "100644 blob $content\t$tricky\n" &&
printf "120000 blob $target\t.gitmodules\n"
} >bad-tree
) &&
tree=$(git -C symlink mktree <symlink/bad-tree)
'

test_expect_success 'fsck detects symlinked .gitmodules file' '
(
cd symlink &&
# Check not only that we fail, but that it is due to the
# symlink detector
test_must_fail git fsck 2>output &&
grep "tree $tree: gitmodulesSymlink" output
)
'

test_expect_success 'refuse to load symlinked .gitmodules into index' '
test_must_fail git -C symlink read-tree $tree 2>err &&
grep "invalid path.*gitmodules" err &&
git -C symlink ls-files >out &&
test_must_be_empty out
'
check_dotx_symlink () {
name=$1
type=$2
path=$3
dir=symlink-$name-$type

test_expect_success "set up repo with symlinked $name ($type)" '
git init $dir &&
(
cd $dir &&
# Make the tree directly to avoid index restrictions.
#
# Because symlinks store the target as a blob, choose
# a pathname that could be parsed as a .gitmodules file
# to trick naive non-symlink-aware checking.
tricky="[foo]bar=true" &&
content=$(git hash-object -w ../.gitmodules) &&
target=$(printf "$tricky" | git hash-object -w --stdin) &&
{
printf "100644 blob $content\t$tricky\n" &&
printf "120000 blob $target\t$path\n"
} >bad-tree
) &&
tree=$(git -C $dir mktree <$dir/bad-tree)
'

test_expect_success "fsck detects symlinked $name ($type)" '
(
cd $dir &&
# Check not only that we fail, but that it is due to the
# symlink detector
test_must_fail git fsck 2>output &&
grep "tree $tree: ${name}Symlink" output
)
'

test_expect_success "refuse to load symlinked $name into index ($type)" '
test_must_fail \
git -C $dir \
-c core.protectntfs \
-c core.protecthfs \
read-tree $tree 2>err &&
grep "invalid path.*$name" err &&
git -C $dir ls-files -s >out &&
test_must_be_empty out
'
}

check_dotx_symlink gitmodules vanilla .gitmodules
check_dotx_symlink gitmodules ntfs ".gitmodules ."
check_dotx_symlink gitmodules hfs ".${u200c}gitmodules"

test_expect_success 'fsck detects non-blob .gitmodules' '
git init non-blob &&
Expand Down

0 comments on commit 1cb12f3

Please sign in to comment.