[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Feb 12 16:47:41 MST 2010


The branch, master has been updated
       via  2fdd8b1... Fix bug #7126 - [SMBD] With access denied error smbd return wrong NT_STATUS_OBJECT_PATH_INVALID error
      from  72242ef... packaging(RHEL-CTDB): adapt configure.rpm to match the spec-file configure call

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2fdd8b10c6abadd27c579e772c0482214d2363a5
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Feb 12 15:45:20 2010 -0800

    Fix bug #7126 - [SMBD] With access denied error smbd return wrong NT_STATUS_OBJECT_PATH_INVALID error
    
    As tridge's comment says, we should be ignoring ACCESS_DENIED
    on the share path in a TconX call, instead allowing the mount
    and having individual SMB calls fail (as Windows does). The
    original code erroneously caught SMB_VFS_STAT != 0 and errored
    out on that.
    
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/service.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index d8ba4fe..6e57e1f 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -1019,20 +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)) {
+	if (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)));
-		} else {
-			DEBUG(0,("'%s' does not exist or permission denied "
-				 "when connecting to [%s] Error was %s\n",
-				 conn->connectpath, lp_servicename(snum),
+			*pstatus = NT_STATUS_BAD_NETWORK_NAME;
+			goto err_root_exit;
+		}
+	} else {
+		/* Stat failed. Bail on any error except permission denied. */
+		if (errno != EACCES) {
+			DEBUG(0,("Connecting to share [%s], path '%s' "
+				"gives error %s\n",
+				lp_servicename(snum),
+				 conn->connectpath,
 				 strerror(errno) ));
+			*pstatus = NT_STATUS_BAD_NETWORK_NAME;
+			goto err_root_exit;
 		}
-		*pstatus = NT_STATUS_BAD_NETWORK_NAME;
-		goto err_root_exit;
+		/* As Windows does, on permsission denied we continue.
+ 		 * Pathname calls fail, not TconX calls. */
 	}
 
 	string_set(&conn->origpath,conn->connectpath);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list