The code that reads .gitattributes files was careless in dealing in unusual circumstances. - It let read errors silently ignored. - It tried to read ".gitattributes" that is a directory on platforms that allowed 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> --- attr.c | 10 +++++++++- t/t0003-attributes.sh | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/attr.c b/attr.c index 300f994ba6..9ab9cf1551 100644 --- a/attr.c +++ b/attr.c @@ -747,6 +747,11 @@ static struct attr_stack *read_attr_from_file(const char *path, unsigned flags) fclose(fp); return NULL; } + if (S_ISDIR(st.st_mode)) { + /* On FREAD_READS_DIRECTORIES platforms */ + fclose(fp); + return NULL; + } if (st.st_size >= ATTR_MAX_FILE_SIZE) { warning(_("ignoring overly large gitattributes file '%s'"), path); fclose(fp); @@ -760,7 +765,10 @@ static struct attr_stack *read_attr_from_file(const char *path, unsigned flags) handle_attr_line(res, buf.buf, path, ++lineno, flags); } - fclose(fp); + if (ferror(fp)) + warning_errno(_("failed while reading gitattributes file '%s'"), path); + if (fclose(fp)) + warning_errno(_("cannot fclose gitattributes file '%s'"), path); strbuf_release(&buf); return res; } diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 66ccb5889d..783c20146d 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -603,6 +603,15 @@ test_expect_success EXPENSIVE 'large attributes blob ignored' ' test_cmp expect err ' +test_expect_success '.gitattribute directory behaves as if it does not exist' ' + test_when_finished "rm -fr dir" && + mkdir -p dir/.gitattributes && + >dir/ectory && + git -C dir check-attr --all ectory >out 2>err && + test_grep ! "failed while reading" err && + test_grep ! "cannot fclose" err +' + test_expect_success 'builtin object mode attributes work (dir and regular paths)' ' >normal && attr_check_object_mode normal 100644 && -- 2.45.2-711-gd2c001ca14