The code that reads .gitignore files was careless in dealing in unusual circumstances. - It let read errors silently ignored. - It tried to read ".gitignore" that is a directory on platforms that allow open(2) to open directories. To make the latter consistent with what we do for fopen() on directories ("git grep" for FREAD_READS_DIRECTORIES for details), check if we opened a directory, silently close it and return success. Catch all read errors before we close and report as needed. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- dir.c | 6 ++++++ t/t0008-ignores.sh | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/dir.c b/dir.c index ec875e3878..73f89f4d8c 100644 --- a/dir.c +++ b/dir.c @@ -1127,6 +1127,10 @@ static int add_patterns(const char *fname, const char *base, int baselen, oid_stat); if (r != 1) return r; + } else if (S_ISDIR(st.st_mode)) { + /* On FREAD_READS_DIRECTORIES platforms */ + close(fd); + return 0; } else { size = xsize_t(st.st_size); if (size == 0) { @@ -1140,6 +1144,8 @@ static int add_patterns(const char *fname, const char *base, int baselen, } buf = xmallocz(size); if (read_in_full(fd, buf, size) != size) { + warning_errno(_("failed while reading gitignore file '%s'"), + fname); free(buf); close(fd); return -1; diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index 02a18d4fdb..c367824c66 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -953,4 +953,22 @@ test_expect_success EXPENSIVE 'large exclude file ignored in tree' ' test_cmp expect err ' +test_expect_success POSIXPERM 'unreadable exclude file reported' ' + test_when_finished "rm -f .gitignore" && + >.gitignore && + chmod a= .gitignore && + # we do not care if the pattern matches + { git check-ignore xyzzy 2>err || :; } && + test_grep "unable to access ${SQ}\.gitignore${SQ}:" err +' + +test_expect_success '.gitignore directory ignored' ' + test_when_finished "rm -rf .gitignore" && + rm -f .gitignore && + mkdir .gitignore && + # we do not care if the pattern matches + { git check-ignore xyzzy 2>err || :; } && + test_grep ! "failed while reading gitignore file ${SQ}\.gitignore${SQ}:" err +' + test_done -- 2.45.2-711-gd2c001ca14