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
This commit is contained in:
21
wrapper.c
21
wrapper.c
@@ -737,7 +737,26 @@ int is_empty_or_missing_file(const char *filename)
|
|||||||
int open_nofollow(const char *path, int flags)
|
int open_nofollow(const char *path, int flags)
|
||||||
{
|
{
|
||||||
#ifdef O_NOFOLLOW
|
#ifdef O_NOFOLLOW
|
||||||
return open(path, flags | O_NOFOLLOW);
|
int ret = open(path, flags | O_NOFOLLOW);
|
||||||
|
/*
|
||||||
|
* NetBSD sets errno to EFTYPE when path is a symlink. The only other
|
||||||
|
* time this errno occurs when O_REGULAR is used. Since we don't use
|
||||||
|
* it anywhere we can avoid an lstat here. FreeBSD does the same with
|
||||||
|
* EMLINK.
|
||||||
|
*/
|
||||||
|
# ifdef __NetBSD__
|
||||||
|
# define SYMLINK_ERRNO EFTYPE
|
||||||
|
# elif defined(__FreeBSD__)
|
||||||
|
# define SYMLINK_ERRNO EMLINK
|
||||||
|
# endif
|
||||||
|
# if SYMLINK_ERRNO
|
||||||
|
if (ret < 0 && errno == SYMLINK_ERRNO) {
|
||||||
|
errno = ELOOP;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# undef SYMLINK_ERRNO
|
||||||
|
# endif
|
||||||
|
return ret;
|
||||||
#else
|
#else
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (lstat(path, &st) < 0)
|
if (lstat(path, &st) < 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user