diff options
author | Jeremy Allison <jra@samba.org> | 2016-12-15 12:56:08 -0800 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2017-03-22 10:48:06 +0100 |
commit | 7942f9d0fe0a19ade1deb345d060197107835ebe (patch) | |
tree | 3d0ea62a73b829ff9568775fe9a3932719ee1ba5 | |
parent | 52a1765f9c2cac77c8d94ddb0e42dd66cba53678 (diff) | |
download | samba-7942f9d0fe0a19ade1deb345d060197107835ebe.tar.gz |
CVE-2017-2619: s3: smbd: Move special handling of symlink errno's into a utility function.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12496
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Uri Simchoni <uri@samba.org>
-rw-r--r-- | source3/smbd/open.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 9828c9981d5..a72b4836376 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -355,6 +355,31 @@ static NTSTATUS check_base_file_access(struct connection_struct *conn, } /**************************************************************************** + Handle differing symlink errno's +****************************************************************************/ + +static int link_errno_convert(int err) +{ +#if defined(ENOTSUP) && defined(OSF1) + /* handle special Tru64 errno */ + if (err == ENOTSUP) { + err = ELOOP; + } +#endif /* ENOTSUP */ +#ifdef EFTYPE + /* fix broken NetBSD errno */ + if (err == EFTYPE) { + err = ELOOP; + } +#endif /* EFTYPE */ + /* fix broken FreeBSD errno */ + if (err == EMLINK) { + err = ELOOP; + } + return err; +} + +/**************************************************************************** fd support routines - attempt to do a dos_open. ****************************************************************************/ @@ -377,23 +402,7 @@ NTSTATUS fd_open(struct connection_struct *conn, fsp->fh->fd = SMB_VFS_OPEN(conn, smb_fname, fsp, flags, mode); if (fsp->fh->fd == -1) { - 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; - } + int posix_errno = link_errno_convert(errno); status = map_nt_error_from_unix(posix_errno); if (errno == EMFILE) { static time_t last_warned = 0L; |