diff options
author | Björn Jacke <bj@sernet.de> | 2009-06-07 13:55:26 +0200 |
---|---|---|
committer | Bjoern Jacke <bj@sernet.de> | 2012-06-10 16:10:01 +0200 |
commit | f75f1d62339f0accb4e574645b1d265c75a01b5b (patch) | |
tree | 2cfd205038c1244b94bf3dcf1bd1850bc917a8c6 /source3 | |
parent | 046daccba59a14ea9bb3827a829529ab20d22656 (diff) | |
download | samba-f75f1d62339f0accb4e574645b1d265c75a01b5b.tar.gz samba-f75f1d62339f0accb4e574645b1d265c75a01b5b.tar.bz2 samba-f75f1d62339f0accb4e574645b1d265c75a01b5b.zip |
s3: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink open calls
or should we leave the NetBSD and FreeBSD platforms just broken? Actually these
two *want* to have broken platforms as they use different errno's than POSIX
demands *interntionally*. The POSIX errno ELOOP for O_NOFOLLOW open calls on
symlinks is clear and unambiguous. See http://gnats.netbsd.org/43154 for the
interesting NetBSD discussion on that.
Autobuild-User(master): Björn Jacke <bj@sernet.de>
Autobuild-Date(master): Sun Jun 10 16:10:02 CEST 2012 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/open.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 4581553be2..cb43dd28ca 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -291,7 +291,26 @@ static NTSTATUS fd_open(struct connection_struct *conn, fsp->fh->fd = SMB_VFS_OPEN(conn, smb_fname, fsp, flags, mode); if (fsp->fh->fd == -1) { - status = map_nt_error_from_unix(errno); +#ifdef O_NOFOLLOW + int posix_errno = errno; +#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; + } +#endif /* O_NOFOLLOW */ + status = map_nt_error_from_unix(posix_errno); if (errno == EMFILE) { static time_t last_warned = 0L; |