]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t7450-bad-git-dotfiles.sh
Sync with 2.31.5
[thirdparty/git.git] / t / t7450-bad-git-dotfiles.sh
similarity index 67%
rename from t/t7415-submodule-names.sh
rename to t/t7450-bad-git-dotfiles.sh
index f37456f15b260f2af0e40272efa40cd69d320940..c02008c3754e2db3b5b342805c7c495951ee2d5d 100755 (executable)
@@ -1,9 +1,16 @@
 #!/bin/sh
 
-test_description='check handling of .. in submodule names
+test_description='check broken or malicious patterns in .git* files
 
-Exercise the name-checking function on a variety of names, and then give a
-real-world setup that confirms we catch this in practice.
+Such as:
+
+  - presence of .. in submodule names;
+    Exercise the name-checking function on a variety of names, and then give a
+    real-world setup that confirms we catch this in practice.
+
+  - nested submodule names
+
+  - symlinked .gitmodules, etc
 '
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-pack.sh
@@ -136,31 +143,84 @@ test_expect_success 'index-pack --strict works for non-repo pack' '
        grep gitmodulesName output
 '
 
-test_expect_success 'fsck detects 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"
-               } | git mktree &&
-
-               # Check not only that we fail, but that it is due to the
-               # symlink detector; this grep string comes from the config
-               # variable name and will not be translated.
-               test_must_fail git fsck 2>output &&
-               test_i18ngrep gitmodulesSymlink output
-       )
-'
+check_dotx_symlink () {
+       fsck_must_fail=test_must_fail
+       fsck_prefix=error
+       refuse_index=t
+       case "$1" in
+       --warning)
+               fsck_must_fail=
+               fsck_prefix=warning
+               refuse_index=
+               shift
+               ;;
+       esac
+
+       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
+                       $fsck_must_fail git fsck 2>output &&
+                       grep "$fsck_prefix.*tree $tree: ${name}Symlink" output
+               )
+       '
+
+       test -n "$refuse_index" &&
+       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"
+
+check_dotx_symlink --warning gitattributes vanilla .gitattributes
+check_dotx_symlink --warning gitattributes ntfs ".gitattributes ."
+check_dotx_symlink --warning gitattributes hfs ".${u200c}gitattributes"
+
+check_dotx_symlink --warning gitignore vanilla .gitignore
+check_dotx_symlink --warning gitignore ntfs ".gitignore ."
+check_dotx_symlink --warning gitignore hfs ".${u200c}gitignore"
+
+check_dotx_symlink --warning mailmap vanilla .mailmap
+check_dotx_symlink --warning mailmap ntfs ".mailmap ."
+check_dotx_symlink --warning mailmap hfs ".${u200c}mailmap"
 
 test_expect_success 'fsck detects non-blob .gitmodules' '
        git init non-blob &&
@@ -195,7 +255,7 @@ test_expect_success 'fsck detects corrupt .gitmodules' '
        )
 '
 
-test_expect_success MINGW 'prevent git~1 squatting on Windows' '
+test_expect_success WINDOWS 'prevent git~1 squatting on Windows' '
        git init squatting &&
        (
                cd squatting &&
@@ -223,10 +283,13 @@ test_expect_success MINGW 'prevent git~1 squatting on Windows' '
                test_tick &&
                git -c core.protectNTFS=false commit -m "module"
        ) &&
-       test_must_fail git -c core.protectNTFS=false \
-               clone --recurse-submodules squatting squatting-clone 2>err &&
-       test_i18ngrep -e "directory not empty" -e "not an empty directory" err &&
-       ! grep gitdir squatting-clone/d/a/git~2
+       if test_have_prereq MINGW
+       then
+               test_must_fail git -c core.protectNTFS=false \
+                       clone --recurse-submodules squatting squatting-clone 2>err &&
+               test_i18ngrep -e "directory not empty" -e "not an empty directory" err &&
+               ! grep gitdir squatting-clone/d/a/git~2
+       fi
 '
 
 test_expect_success 'git dirs of sibling submodules must not be nested' '