Skip to content

Commit f47bcc3

Browse files
collinfunkgitster
authored andcommitted
wrapper: NetBSD gives EFTYPE and FreeBSD gives EMFILE where POSIX uses ELOOP
As documented on NetBSD's man page, open with the O_NOFOLLOW flag and a symlink returns -1 and sets errno to EFTYPE which differs from POSIX. This patch fixes the following test failure: $ sh t0602-reffiles-fsck.sh --verbose --- expect 2025-05-02 23:05:23.920890147 +0000 +++ err 2025-05-02 23:05:23.916794959 +0000 @@ -1 +1 @@ -error: packed-refs: badRefFiletype: not a regular file but a symlink +error: unable to open '.git/packed-refs': Inappropriate file type or format not ok 12 - the filetype of packed-refs should be checked FreeBSD has the same issue for EMLINK instead of EFTYPE. This portability issue was introduced in cfea2f2 (packed-backend: check whether the "packed-refs" is regular file, 2025-02-28) Signed-off-by: Collin Funk <[email protected]> Acked-by: brian m. carlson <[email protected]> Acked-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d50a5e8 commit f47bcc3

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

wrapper.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,26 @@ int is_empty_or_missing_file(const char *filename)
737737
int open_nofollow(const char *path, int flags)
738738
{
739739
#ifdef O_NOFOLLOW
740-
return open(path, flags | O_NOFOLLOW);
740+
int ret = open(path, flags | O_NOFOLLOW);
741+
/*
742+
* NetBSD sets errno to EFTYPE when path is a symlink. The only other
743+
* time this errno occurs when O_REGULAR is used. Since we don't use
744+
* it anywhere we can avoid an lstat here. FreeBSD does the same with
745+
* EMLINK.
746+
*/
747+
# ifdef __NetBSD__
748+
# define SYMLINK_ERRNO EFTYPE
749+
# elif defined(__FreeBSD__)
750+
# define SYMLINK_ERRNO EMLINK
751+
# endif
752+
# if SYMLINK_ERRNO
753+
if (ret < 0 && errno == SYMLINK_ERRNO) {
754+
errno = ELOOP;
755+
return -1;
756+
}
757+
# undef SYMLINK_ERRNO
758+
# endif
759+
return ret;
741760
#else
742761
struct stat st;
743762
if (lstat(path, &st) < 0)

0 commit comments

Comments
 (0)