From 8f78403f2a0d7efb290229f3961eadf5194a39b9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 12 Feb 2010 16:51:27 -0800 Subject: [PATCH] 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. --- source3/smbd/service.c | 25 +++++++++++++++---------- 1 files changed, 15 insertions(+), 10 deletions(-) diff --git a/source3/smbd/service.c b/source3/smbd/service.c index 6248f5d..7d610e6 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -1012,20 +1012,25 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser, 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, conn->connectpath, &st)) != 0 || - !S_ISDIR(st.st_mode)) { - if (ret == 0 && !S_ISDIR(st.st_mode)) { + if (SMB_VFS_STAT(conn, conn->connectpath, &st) == 0) { + if (!S_ISDIR(st.st_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), - strerror(errno) )); + *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; } string_set(&conn->origpath,conn->connectpath); -- 1.6.6