The previous commit made it impossible to have a symlinked .gitattributes or .gitignore file via verify_path(). Let's add the same check to fsck, which matches how we handle .gitmodules symlinks, via b7b1fca175 (fsck: complain when .gitmodules is a symlink, 2018-05-04). Note that we won't add these to the existing gitmodules block. Its logic is a bit more complicated, as we also check the content of non-symlink instances we find. But for these new files, there is no content check; we're just looking at the name and mode of the tree entry (and we can avoid even the complicated name checks in the common case that the mode doesn't indicate a symlink). Signed-off-by: Jeff King <peff@xxxxxxxx> --- fsck.c | 15 +++++++++++++++ t/t7450-bad-meta-files.sh | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/fsck.c b/fsck.c index 024810139b..fcd3f268b1 100644 --- a/fsck.c +++ b/fsck.c @@ -67,6 +67,8 @@ static struct oidset gitmodules_done = OIDSET_INIT; FUNC(GITMODULES_URL, ERROR) \ FUNC(GITMODULES_PATH, ERROR) \ FUNC(GITMODULES_UPDATE, ERROR) \ + FUNC(GITIGNORE_SYMLINK, ERROR) \ + FUNC(GITATTRIBUTES_SYMLINK, ERROR) \ /* warnings */ \ FUNC(BAD_FILEMODE, WARN) \ FUNC(EMPTY_NAME, WARN) \ @@ -688,6 +690,19 @@ static int fsck_tree(const struct object_id *tree_oid, ".gitmodules is a symbolic link"); } + if (S_ISLNK(mode)) { + if (is_hfs_dotgitignore(name) || + is_ntfs_dotgitignore(name)) + retval += report(options, tree_oid, OBJ_TREE, + FSCK_MSG_GITIGNORE_SYMLINK, + ".gitignore is a symlink"); + if (is_hfs_dotgitattributes(name) || + is_ntfs_dotgitattributes(name)) + retval += report(options, tree_oid, OBJ_TREE, + FSCK_MSG_GITATTRIBUTES_SYMLINK, + ".gitattributes is a symlink"); + } + if ((backslash = strchr(name, '\\'))) { while (backslash) { backslash++; diff --git a/t/t7450-bad-meta-files.sh b/t/t7450-bad-meta-files.sh index 6a038ed55b..c7201803ec 100755 --- a/t/t7450-bad-meta-files.sh +++ b/t/t7450-bad-meta-files.sh @@ -281,6 +281,11 @@ test_expect_success 'refuse to load symlinked .gitattributes into index' ' test_i18ngrep "invalid path.*gitattributes" err ' +test_expect_success 'fsck detects symlinked .gitattributes file' ' + test_must_fail git -C symlink-attr fsck 2>err && + test_i18ngrep "tree $tree: gitattributesSymlink" err +' + test_expect_success 'create repo with symlinked .gitignore file' ' git init symlink-ignore && target=$(echo target | git -C symlink-ignore hash-object -w --stdin) && @@ -295,5 +300,9 @@ test_expect_success 'refuse to load symlinked .gitignore into index' ' test_i18ngrep "invalid path.*gitignore" err ' +test_expect_success 'fsck detects symlinked .gitignore file' ' + test_must_fail git -C symlink-ignore fsck 2>err && + test_i18ngrep "tree $tree: gitignoreSymlink" err +' test_done -- 2.28.0.1295.g4824feede7