diff --git a/source3/smbd/service.c b/source3/smbd/service.c index d8ba4fe..976b2de 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -1019,19 +1019,27 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn, check during individual operations. To match this behaviour I have disabled this chdir check (tridge) */ /* the alternative is just to check the directory exists */ - if ((ret = SMB_VFS_STAT(conn, smb_fname_cpath)) != 0 || - !S_ISDIR(smb_fname_cpath->st.st_ex_mode)) { - if (ret == 0 && !S_ISDIR(smb_fname_cpath->st.st_ex_mode)) { - DEBUG(0,("'%s' is not a directory, when connecting to " - "[%s]\n", conn->connectpath, - lp_servicename(snum))); + if ((ret = SMB_VFS_STAT(conn, smb_fname_cpath)) == 0) { + if (!S_ISDIR(smb_fname_cpath->st.st_ex_mode)) { + DEBUG(0,("'%s' is not a directory, when connecting " + "to [%s]\n", conn->connectpath, + lp_servicename(snum))); + *pstatus = NT_STATUS_BAD_NETWORK_NAME; + goto err_root_exit; + } + } else { + /* stat failed. Use NT_STATUS_BAD_NETWORK_NAME unless + * we got access denied. */ + DEBUG(0, ("stat on directory '%s' failed when " + "connecting to [%s] Error was %s\n", + conn->connectpath, lp_servicename(snum), + strerror(errno))); + + if (errno == EACCES) { + *pstatus = NT_STATUS_ACCESS_DENIED; } else { - DEBUG(0,("'%s' does not exist or permission denied " - "when connecting to [%s] Error was %s\n", - conn->connectpath, lp_servicename(snum), - strerror(errno) )); + *pstatus = NT_STATUS_BAD_NETWORK_NAME; } - *pstatus = NT_STATUS_BAD_NETWORK_NAME; goto err_root_exit; }