diff options
-rw-r--r-- | source3/smbd/open.c | 7 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 30 |
2 files changed, 27 insertions, 10 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 1a8a087bb7..7784740063 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -47,7 +47,12 @@ static NTSTATUS fd_open(struct connection_struct *conn, NTSTATUS status = NT_STATUS_OK; #ifdef O_NOFOLLOW - if (!lp_symlinks(SNUM(conn))) { + /* + * Never follow symlinks on a POSIX client. The + * client should be doing this. + */ + + if (fsp->posix_open || !lp_symlinks(SNUM(conn))) { flags |= O_NOFOLLOW; } #endif diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 63fd414e16..a41aa3c7df 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5777,9 +5777,17 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char * to do this call. JRA. */ pstrcpy(fname, fsp->fsp_name); - if (SMB_VFS_STAT(conn,fname,&sbuf) != 0) { - DEBUG(3,("call_trans2setfilepathinfo: fileinfo of %s failed (%s)\n",fname,strerror(errno))); - return UNIXERROR(ERRDOS,ERRbadpath); + if (INFO_LEVEL_IS_UNIX(info_level)) { + /* Always do lstat for UNIX calls. */ + if (SMB_VFS_LSTAT(conn,fname,&sbuf)) { + DEBUG(3,("call_trans2setfilepathinfo: SMB_VFS_LSTAT of %s failed (%s)\n",fname,strerror(errno))); + return UNIXERROR(ERRDOS,ERRbadpath); + } + } else { + if (SMB_VFS_STAT(conn,fname,&sbuf) != 0) { + DEBUG(3,("call_trans2setfilepathinfo: fileinfo of %s failed (%s)\n",fname,strerror(errno))); + return UNIXERROR(ERRDOS,ERRbadpath); + } } } else if (fsp && fsp->print_file) { /* @@ -5838,14 +5846,18 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char return ERROR_NT(status); } - /* - * For CIFS UNIX extensions the target name may not exist. - */ + if (INFO_LEVEL_IS_UNIX(info_level)) { + /* + * For CIFS UNIX extensions the target name may not exist. + */ + + /* Always do lstat for UNIX calls. */ + SMB_VFS_LSTAT(conn,fname,&sbuf); - if(!VALID_STAT(sbuf) && !INFO_LEVEL_IS_UNIX(info_level)) { - DEBUG(3,("call_trans2setfilepathinfo: stat of %s failed (%s)\n", fname, strerror(errno))); + } else if (!VALID_STAT(sbuf) && SMB_VFS_STAT(conn,fname,&sbuf)) { + DEBUG(3,("call_trans2setfilepathinfo: SMB_VFS_STAT of %s failed (%s)\n",fname,strerror(errno))); return UNIXERROR(ERRDOS,ERRbadpath); - } + } } if (!CAN_WRITE(conn)) { |