s3: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink...
authorBjörn Jacke <bj@sernet.de>
Sun, 7 Jun 2009 11:55:26 +0000 (13:55 +0200)
committerBjoern Jacke <bj@sernet.de>
Sun, 10 Jun 2012 14:10:01 +0000 (16:10 +0200)
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

source3/smbd/open.c

index 4581553be2f8e1af26503a4de47eb636836e516e..cb43dd28caa2b47da532f85eea9ffdd405726311 100644 (file)
@@ -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;