summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorBjörn Jacke <bj@sernet.de>2009-06-07 13:55:26 +0200
committerBjoern Jacke <bj@sernet.de>2012-06-10 16:10:01 +0200
commitf75f1d62339f0accb4e574645b1d265c75a01b5b (patch)
tree2cfd205038c1244b94bf3dcf1bd1850bc917a8c6 /source3
parent046daccba59a14ea9bb3827a829529ab20d22656 (diff)
downloadsamba-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.c21
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;