diff options
author | Björn Jacke <bj@sernet.de> | 2012-06-10 20:17:44 +0200 |
---|---|---|
committer | Bjoern Jacke <bj@sernet.de> | 2012-06-10 21:38:08 +0200 |
commit | 2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e (patch) | |
tree | 258fcdaa30b5fbf0d85e9dc2e69988a89e37b25b | |
parent | f97ca7d64318343eb1fd2ed3d8248c6560166fb4 (diff) | |
download | samba-2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e.tar.gz samba-2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e.tar.bz2 samba-2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e.zip |
s4/pvfs: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink open calls
see also f75f1d62339f0accb4e574645b1d265c75a01b5b
-rw-r--r-- | source4/ntvfs/posix/pvfs_sys.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/source4/ntvfs/posix/pvfs_sys.c b/source4/ntvfs/posix/pvfs_sys.c index 9112848bfe..5775d0bb77 100644 --- a/source4/ntvfs/posix/pvfs_sys.c +++ b/source4/ntvfs/posix/pvfs_sys.c @@ -405,11 +405,32 @@ int pvfs_sys_unlink(struct pvfs_state *pvfs, const char *filename, bool allow_ov static bool contains_symlink(const char *path) { int fd = open(path, PVFS_NOFOLLOW | O_RDONLY); + int posix_errno = errno; if (fd != -1) { close(fd); return false; } - return (errno == ELOOP); + +#if defined(ENOTSUP) && defined(OSF1) + /* handle special Tru64 errno */ + if (errno == ENOTSUP) { + posix_errno = ELOOP; + } +#endif /* ENOTSUP */ + +#ifdef EFTYPE + /* fix broken NetBSD errno */ + if (errno == EFTYPE) { + posix_errno = ELOOP; + } +#endif /* EFTYPE */ + + /* fix broken FreeBSD errno */ + if (errno == EMLINK) { + posix_errno = ELOOP; + } + + return (posix_errno == ELOOP); } /* |