Skip to content

Commit 1d01042

Browse files
committed
Merge branch 'cf/wrapper-bsd-eloop'
The fallback implementation of open_nofollow() depended on open("symlink", O_NOFOLLOW) to set errno to ELOOP, but a few BSD derived systems use different errno, which has been worked around. * cf/wrapper-bsd-eloop: wrapper: NetBSD gives EFTYPE and FreeBSD gives EMFILE where POSIX uses ELOOP
2 parents 1a8a497 + f47bcc3 commit 1d01042

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)