[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Dec 15 19:27:01 UTC 2021


The branch, master has been updated
       via  c8c3c547646 s3: smbd: In call_trans2qfilepathinfo(), remove unneeded vfs_stat().
       via  6000d3408e3 s3: smbd: In call_trans2qfilepathinfo(), we must have an existing object in the QPATHINFO case.
       via  834aa7bb011 s3: smbd: Inside call_trans2setfilepathinfo(), for the TRANSACT2_SETPATHINFO case, we don't need to re-stat.
       via  d508dff6345 s3: smbd: Inside call_trans2setfilepathinfo(), for the TRANSACT2_SETPATHINFO case, ensure we have a VALID_STAT return from filename_convert().
       via  eabcaa2e554 s3: smbd: call_trans2setfilepathinfo(), TRANSACT2_SETFILEINFO case, use helper function vfs_stat().
       via  de88369c358 s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QPATHINFO, use helper function vfs_stat().
       via  80e3f4e5ca6 s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QPATHINFO on a named stream case, use helper function vfs_stat().
       via  8c0f34f0570 s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QFILEINFO case, use helper function vfs_stat().
       via  eb0e68d0e7a s3: smbd: In parent_dirname_compatible_open(), use helper function vfs_stat().
       via  04a4cd2ada7 s3: smbd: In vfs_stat_smb_basename() use vfs_stat() helper function.
       via  b0a41119f4c s3: smbd: In smbd_smb2_getinfo_send(), use vfs_stat() utility function.
       via  da2d61ba80d s3: smbd: In stat_cache_lookup(), remove unused posix_paths param.
       via  d8f09c1bf09 s3: smbd: In stat_cache_lookup(), use vfs_stat() utility function.
       via  c94d919fd9c s3: smbd: In setup_close_full_information() the posix_open parameter is not needed anymore.
       via  89574ed33ba s3: smbd: In setup_close_full_information() use vfs_stat() helper function.
       via  8767f60a0a2 s3: smbd: In check_parent_exists() use utility function vfs_stat().
      from  0f4eca775aa tests/krb5: Add tests for AS-REQ to self with FAST

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


- Log -----------------------------------------------------------------
commit c8c3c547646c2f91c63b5a195476d5bed88ae2a1
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Dec 14 09:50:12 2021 -0800

    s3: smbd: In call_trans2qfilepathinfo(), remove unneeded vfs_stat().
    
    We know at this point that we have VALID_STAT(smb_fname->st).
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Wed Dec 15 19:26:50 UTC 2021 on sn-devel-184

commit 6000d3408e303936eaccdc06d4e7f3087834ce13
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Dec 14 09:46:51 2021 -0800

    s3: smbd: In call_trans2qfilepathinfo(), we must have an existing object in the QPATHINFO case.
    
    qpathinfo must operate on an existing file, so we
    can exit early if filename_convert() returned the "new file"
    NT_STATUS_OK, !VALID_STAT case.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 834aa7bb0118ad3fab7cc2bb80d9be48f2e5b7e4
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 16:54:07 2021 -0800

    s3: smbd: Inside call_trans2setfilepathinfo(), for the TRANSACT2_SETPATHINFO case, we don't need to re-stat.
    
    If we need a valid filesystem object, and we have a !VALID_STAT()
    return from filename_convert(), the previous commit has already
    errored out. We don't need a re-stat call here.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit d508dff634509eb9c3a69ef628f618eeeda34d9b
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 16:48:14 2021 -0800

    s3: smbd: Inside call_trans2setfilepathinfo(), for the TRANSACT2_SETPATHINFO case, ensure we have a VALID_STAT return from filename_convert().
    
    Remember, filename_convert() can return NT_STATUS_OK
    with !VALID_STAT() if the last component doesn't exist,
    as this may be an object create.
    
    For call_trans2setfilepathinfo(), there are only 4 info levels
    for the TRANSACT2_SETPATHINFO (pathname) case that don't require
    an existing filesystem object (i.e. a VALID_STAT()) in the return
    from filename_convert() as they can create an object in the
    filesystem.
    
    If we don't get a VALID_STAT() and the info level isn't one of
    those 4, error out.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit eabcaa2e5545abce9363b729a8128046e10a6191
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 14:19:35 2021 -0800

    s3: smbd: call_trans2setfilepathinfo(), TRANSACT2_SETFILEINFO case, use helper function vfs_stat().
    
    This isn't a change in behavior, even though the
    old comment says: "Always do lstat for UNIX calls".
    
    A previous commit enforces POSIX pathname negotiation
    before allowing UNIX info levels to be processed here,
    so we can guarantee that SMB_FILENAME_POSIX_PATH is set
    on smb_fname if we're allowing a UNIX info level.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit de88369c358abee3f6991a99c2b6e6f1e589ce52
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 14:13:59 2021 -0800

    s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QPATHINFO, use helper function vfs_stat().
    
    This isn't a change in behavior, even though the
    old comment says: "Always do lstat for UNIX calls".
    
    A previous commit enforces POSIX pathname negotiation
    before allowing UNIX info levels to be processed here,
    so we can guarantee that SMB_FILENAME_POSIX_PATH is set
    on smb_fname if we're allowing a UNIX info level.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 80e3f4e5ca66cff1d078a8020c7de918824bb75a
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 14:09:33 2021 -0800

    s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QPATHINFO on a named stream case, use helper function vfs_stat().
    
    This isn't a change in behavior, even though the
    old comment says: "Always do lstat for UNIX calls".
    
    A previous commit enforces POSIX pathname negotiation
    before allowing UNIX info levels to be processed here,
    so we can guarantee that SMB_FILENAME_POSIX_PATH is set
    on smb_fname if we're allowing a UNIX info level.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 8c0f34f05706f7e172c96f54e679d34962f67a2e
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 14:05:32 2021 -0800

    s3: smbd: In call_trans2qfilepathinfo(), TRANSACT2_QFILEINFO case, use helper function vfs_stat().
    
    This isn't a change in behavior, even though the
    old comment says: "Always do lstat for UNIX calls".
    
    A previous commit enforces POSIX pathname negotiation
    before allowing UNIX info levels to be processed here,
    so we can guarantee that SMB_FILENAME_POSIX_PATH is set
    on smb_fname if we're allowing a UNIX info level.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit eb0e68d0e7a22f0cc2a53757d7daf87489406282
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 16:08:14 2021 -0800

    s3: smbd: In parent_dirname_compatible_open(), use helper function vfs_stat().
    
    This is a change in behavior, but the old behavior was incorrect.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 04a4cd2ada7557f0db5bd32e7459b146567d2240
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 14:02:51 2021 -0800

    s3: smbd: In vfs_stat_smb_basename() use vfs_stat() helper function.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit b0a41119f4ccebd8930cc79d6fe381ab4b363058
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 13:45:13 2021 -0800

    s3: smbd: In smbd_smb2_getinfo_send(), use vfs_stat() utility function.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <noel.power at suse.com>

commit da2d61ba80d5b7cc87e52e373cdb2f2270b86c12
Author: Noel Power <noel.power at suse.com>
Date:   Wed Dec 15 15:55:02 2021 +0000

    s3: smbd: In stat_cache_lookup(), remove unused posix_paths param.
    
    Signed-off-by: Noel Power <npower at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d8f09c1bf097087f287d39b660f135793b652d2d
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 13:44:25 2021 -0800

    s3: smbd: In stat_cache_lookup(), use vfs_stat() utility function.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <noel.power at suse.com>

commit c94d919fd9c93f6d8987e2a0d6fa4ba066497d99
Author: Noel Power <noel.power at suse.com>
Date:   Wed Dec 15 15:36:22 2021 +0000

    s3: smbd: In setup_close_full_information() the posix_open parameter is not needed anymore.
    
    Signed-off-by: Noel Power <npower at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 89574ed33ba5b22c05e8f1911f663e4f7026a78f
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 13:43:06 2021 -0800

    s3: smbd: In setup_close_full_information() use vfs_stat() helper function.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 8767f60a0a2db0bd9c0de2a36b9cef64efef6ada
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Dec 13 13:42:35 2021 -0800

    s3: smbd: In check_parent_exists() use utility function vfs_stat().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

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

Summary of changes:
 source3/smbd/filename.c     |   7 +-
 source3/smbd/proto.h        |   1 -
 source3/smbd/reply.c        |   2 +-
 source3/smbd/smb2_close.c   |  11 +--
 source3/smbd/smb2_getinfo.c |  20 ++----
 source3/smbd/statcache.c    |   8 +--
 source3/smbd/trans2.c       | 160 ++++++++++++++++----------------------------
 source3/smbd/vfs.c          |   7 +-
 8 files changed, 68 insertions(+), 148 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 19eea2d6a77..4c5dbbfacbd 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -169,11 +169,7 @@ static NTSTATUS check_parent_exists(TALLOC_CTX *ctx,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	if (posix_pathnames) {
-		ret = SMB_VFS_LSTAT(conn, parent_fname);
-	} else {
-		ret = SMB_VFS_STAT(conn, parent_fname);
-	}
+	ret = vfs_stat(conn, parent_fname);
 
 	/* If the parent stat failed, just continue
 	   with the normal tree walk. */
@@ -1096,7 +1092,6 @@ NTSTATUS unix_convert(TALLOC_CTX *mem_ctx,
 		bool found;
 
 		found = stat_cache_lookup(state->conn,
-					  state->posix_pathnames,
 					  &state->smb_fname->base_name,
 					  &state->dirpath,
 					  &state->name,
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 1e31ded1b1a..4c1792d3932 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -1165,7 +1165,6 @@ void stat_cache_add( const char *full_orig_name,
 		NTTIME twrp,
 		bool case_sensitive);
 bool stat_cache_lookup(connection_struct *conn,
-			bool posix_paths,
 			char **pp_name,
 			char **pp_dirpath,
 			char **pp_start,
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index d7c5b962ca7..eeae563766a 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -7072,7 +7072,7 @@ static NTSTATUS parent_dirname_compatible_open(connection_struct *conn,
 		return status;
 	}
 
-	ret = SMB_VFS_LSTAT(conn, smb_fname_parent);
+	ret = vfs_stat(conn, smb_fname_parent);
 	if (ret == -1) {
 		return map_nt_error_from_unix(errno);
 	}
diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index da2a8fa59c8..c218d12b668 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -153,7 +153,6 @@ static void smbd_smb2_request_close_done(struct tevent_req *subreq)
 
 static void setup_close_full_information(connection_struct *conn,
 				struct smb_filename *smb_fname,
-				bool posix_open,
 				struct timespec *out_creation_ts,
 				struct timespec *out_last_access_ts,
 				struct timespec *out_last_write_ts,
@@ -177,11 +176,7 @@ static void setup_close_full_information(connection_struct *conn,
 		return;
 	}
 
-	if (posix_open) {
-		ret = SMB_VFS_LSTAT(conn, smb_fname);
-	} else {
-		ret = SMB_VFS_STAT(conn, smb_fname);
-	}
+	ret = vfs_stat(conn, smb_fname);
 	if (ret != 0) {
 		return;
 	}
@@ -226,7 +221,6 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 	uint64_t file_size = 0;
 	uint32_t dos_attrs = 0;
 	uint16_t flags = 0;
-	bool posix_open = false;
 
 	*out_creation_ts = (struct timespec){0, SAMBA_UTIME_OMIT};
 	*out_last_access_ts = (struct timespec){0, SAMBA_UTIME_OMIT};
@@ -246,7 +240,6 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	posix_open = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
 	smb_fname = cp_smb_filename(talloc_tos(), fsp->fsp_name);
 	if (smb_fname == NULL) {
 		return NT_STATUS_NO_MEMORY;
@@ -263,7 +256,6 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 		 */
 		setup_close_full_information(conn,
 				smb_fname,
-				posix_open,
 				out_creation_ts,
 				out_last_access_ts,
 				out_last_write_ts,
@@ -284,7 +276,6 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 	if (in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) {
 		setup_close_full_information(conn,
 				smb_fname,
-				posix_open,
 				out_creation_ts,
 				out_last_access_ts,
 				out_last_write_ts,
diff --git a/source3/smbd/smb2_getinfo.c b/source3/smbd/smb2_getinfo.c
index 6df4a37af17..a918cc03385 100644
--- a/source3/smbd/smb2_getinfo.c
+++ b/source3/smbd/smb2_getinfo.c
@@ -340,23 +340,11 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
 			 * handle (returned from an NT SMB). NT5.0 seems
 			 * to do this call. JRA.
 			 */
-
-			if (fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH) {
-				/* Always do lstat for UNIX calls. */
-				if (SMB_VFS_LSTAT(conn, fsp->fsp_name)) {
-					DEBUG(3,("smbd_smb2_getinfo_send: "
-						 "SMB_VFS_LSTAT of %s failed "
-						 "(%s)\n", fsp_str_dbg(fsp),
-						 strerror(errno)));
-					status = map_nt_error_from_unix(errno);
-					tevent_req_nterror(req, status);
-					return tevent_req_post(req, ev);
-				}
-			} else if (SMB_VFS_STAT(conn, fsp->fsp_name)) {
-				DEBUG(3,("smbd_smb2_getinfo_send: "
-					 "SMB_VFS_STAT of %s failed (%s)\n",
+			int ret = vfs_stat(conn, fsp->fsp_name);
+			if (ret != 0) {
+				DBG_NOTICE("vfs_stat of %s failed (%s)\n",
 					 fsp_str_dbg(fsp),
-					 strerror(errno)));
+					 strerror(errno));
 				status = map_nt_error_from_unix(errno);
 				tevent_req_nterror(req, status);
 				return tevent_req_post(req, ev);
diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c
index ddbd663ad5b..3b7a3c4f4f0 100644
--- a/source3/smbd/statcache.c
+++ b/source3/smbd/statcache.c
@@ -196,7 +196,6 @@ void stat_cache_add( const char *full_orig_name,
  */
 
 bool stat_cache_lookup(connection_struct *conn,
-			bool posix_paths,
 			char **pp_name,
 			char **pp_dirpath,
 			char **pp_start,
@@ -331,12 +330,7 @@ bool stat_cache_lookup(connection_struct *conn,
 		.twrp = twrp,
 	};
 
-	if (posix_paths) {
-		ret = SMB_VFS_LSTAT(conn, &smb_fname);
-	} else {
-		ret = SMB_VFS_STAT(conn, &smb_fname);
-	}
-
+	ret = vfs_stat(conn, &smb_fname);
 	if (ret != 0) {
 		/* Discard this entry - it doesn't exist in the filesystem. */
 		memcache_delete(smbd_memcache(), STAT_CACHE,
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index eb6a66d553d..dad9d7b18a4 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -5947,6 +5947,7 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 	char *lock_data = NULL;
 	size_t fixed_portion;
 	NTSTATUS status = NT_STATUS_OK;
+	int ret;
 
 	if (!params) {
 		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -6005,24 +6006,11 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 			 * handle (returned from an NT SMB). NT5.0 seems
 			 * to do this call. JRA.
 			 */
-
-			if (INFO_LEVEL_IS_UNIX(info_level)) {
-				/* Always do lstat for UNIX calls. */
-				if (SMB_VFS_LSTAT(conn, smb_fname)) {
-					DEBUG(3,("call_trans2qfilepathinfo: "
-						 "SMB_VFS_LSTAT of %s failed "
-						 "(%s)\n",
-						 smb_fname_str_dbg(smb_fname),
-						 strerror(errno)));
-					reply_nterror(req,
-						map_nt_error_from_unix(errno));
-					return;
-				}
-			} else if (SMB_VFS_STAT(conn, smb_fname)) {
-				DEBUG(3,("call_trans2qfilepathinfo: "
-					 "SMB_VFS_STAT of %s failed (%s)\n",
+			ret = vfs_stat(conn, smb_fname);
+			if (ret != 0) {
+				DBG_NOTICE("vfs_stat of %s failed (%s)\n",
 					 smb_fname_str_dbg(smb_fname),
-					 strerror(errno)));
+					 strerror(errno));
 				reply_nterror(req,
 					map_nt_error_from_unix(errno));
 				return;
@@ -6122,6 +6110,17 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 			return;
 		}
 
+		/*
+		 * qpathinfo must operate on an existing file, so we
+		 * can exit early if filename_convert() returned the "new file"
+		 * NT_STATUS_OK, !VALID_STAT case.
+		 */
+
+		if (!VALID_STAT(smb_fname->st)) {
+			reply_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+			return;
+		}
+
 		/*
 		 * smb_fname->fsp may be NULL if smb_fname points at a symlink
 		 * and we're in POSIX context, so be careful when using fsp
@@ -6147,31 +6146,16 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 				return;
 			}
 
-			if (INFO_LEVEL_IS_UNIX(info_level) || req->posix_pathnames) {
-				/* Always do lstat for UNIX calls. */
-				if (SMB_VFS_LSTAT(conn, smb_fname_base) != 0) {
-					DEBUG(3,("call_trans2qfilepathinfo: "
-						 "SMB_VFS_LSTAT of %s failed "
-						 "(%s)\n",
-						 smb_fname_str_dbg(smb_fname_base),
-						 strerror(errno)));
-					TALLOC_FREE(smb_fname_base);
-					reply_nterror(req,
-						map_nt_error_from_unix(errno));
-					return;
-				}
-			} else {
-				if (SMB_VFS_STAT(conn, smb_fname_base) != 0) {
-					DEBUG(3,("call_trans2qfilepathinfo: "
-						 "fileinfo of %s failed "
-						 "(%s)\n",
-						 smb_fname_str_dbg(smb_fname_base),
-						 strerror(errno)));
-					TALLOC_FREE(smb_fname_base);
-					reply_nterror(req,
-						map_nt_error_from_unix(errno));
-					return;
-				}
+			ret = vfs_stat(conn, smb_fname_base);
+			if (ret != 0) {
+				DBG_NOTICE("vfs_stat of %s failed "
+					"(%s)\n",
+					smb_fname_str_dbg(smb_fname_base),
+					strerror(errno));
+				TALLOC_FREE(smb_fname_base);
+				reply_nterror(req,
+					map_nt_error_from_unix(errno));
+				return;
 			}
 
 			status = file_name_hash(conn,
@@ -6193,30 +6177,6 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
 			}
 		}
 
-		if (INFO_LEVEL_IS_UNIX(info_level) || req->posix_pathnames) {
-			/* Always do lstat for UNIX calls. */
-			if (SMB_VFS_LSTAT(conn, smb_fname)) {
-				DEBUG(3,("call_trans2qfilepathinfo: "
-					 "SMB_VFS_LSTAT of %s failed (%s)\n",
-					 smb_fname_str_dbg(smb_fname),
-					 strerror(errno)));
-				reply_nterror(req,
-					map_nt_error_from_unix(errno));
-				return;
-			}
-
-		} else {
-			if (SMB_VFS_STAT(conn, smb_fname) != 0) {
-				DEBUG(3,("call_trans2qfilepathinfo: "
-					 "SMB_VFS_STAT of %s failed (%s)\n",
-					 smb_fname_str_dbg(smb_fname),
-					 strerror(errno)));
-				reply_nterror(req,
-					map_nt_error_from_unix(errno));
-				return;
-			}
-		}
-
 		status = file_name_hash(conn,
 				smb_fname_str_dbg(smb_fname),
 				&name_hash);
@@ -9291,6 +9251,7 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 	files_struct *fsp = NULL;
 	NTSTATUS status = NT_STATUS_OK;
 	int data_return_size = 0;
+	int ret;
 
 	if (!params) {
 		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -9329,26 +9290,14 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 			 * handle (returned from an NT SMB). NT5.0 seems
 			 * to do this call. JRA.
 			 */
-			if (INFO_LEVEL_IS_UNIX(info_level)) {
-				/* Always do lstat for UNIX calls. */
-				if (SMB_VFS_LSTAT(conn, smb_fname)) {
-					DEBUG(3,("call_trans2setfilepathinfo: "
-						 "SMB_VFS_LSTAT of %s failed "
-						 "(%s)\n",
-						 smb_fname_str_dbg(smb_fname),
-						 strerror(errno)));
-					reply_nterror(req, map_nt_error_from_unix(errno));
-					return;
-				}
-			} else {
-				if (SMB_VFS_STAT(conn, smb_fname) != 0) {
-					DEBUG(3,("call_trans2setfilepathinfo: "
-						 "fileinfo of %s failed (%s)\n",
-						 smb_fname_str_dbg(smb_fname),
-						 strerror(errno)));
-					reply_nterror(req, map_nt_error_from_unix(errno));
-					return;
-				}
+			ret = vfs_stat(conn, smb_fname);
+			if (ret != 0) {
+				DBG_NOTICE("vfs_stat of %s failed (%s)\n",
+					smb_fname_str_dbg(smb_fname),
+					strerror(errno));
+				reply_nterror(req,
+					map_nt_error_from_unix(errno));
+				return;
 			}
 		} else if (fsp->print_file) {
 			/*
@@ -9391,6 +9340,7 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 	} else {
 		char *fname = NULL;
 		uint32_t ucf_flags = ucf_flags_from_smb_request(req);
+		bool require_existing_object = true;
 
 		/* set path info */
 		if (total_params < 7) {
@@ -9458,22 +9408,30 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
 		 */
 		fsp = smb_fname->fsp;
 
-		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, smb_fname);
+		/*
+		 * There are 4 info levels which can
+		 * create a new object in the filesystem.
+		 * They are:
+		 * SMB_SET_FILE_UNIX_LINK -> creates POSIX symlink.
+		 * SMB_POSIX_PATH_OPEN -> creates POSIX file or directory.
+		 * SMB_SET_FILE_UNIX_BASIC:
+		 * SMB_SET_FILE_UNIX_INFO2: can create a POSIX special file.
+		 *
+		 * These info levels do not require an existing object.
+		 */
+		switch (info_level) {
+		case SMB_SET_FILE_UNIX_LINK:
+		case SMB_POSIX_PATH_OPEN:
+		case SMB_SET_FILE_UNIX_BASIC:
+		case SMB_SET_FILE_UNIX_INFO2:
+			require_existing_object = false;
+			break;
+		default:
+			break;
+		}
 
-		} else if (!VALID_STAT(smb_fname->st) &&
-			   SMB_VFS_STAT(conn, smb_fname)) {
-			DEBUG(3,("call_trans2setfilepathinfo: SMB_VFS_STAT of "
-				 "%s failed (%s)\n",
-				 smb_fname_str_dbg(smb_fname),
-				 strerror(errno)));
-			reply_nterror(req, map_nt_error_from_unix(errno));
-			return;
+		if (!VALID_STAT(smb_fname->st) && require_existing_object) {
+			reply_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
 		}
 	}
 
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 4091aa304d4..9bc528837d7 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -1352,12 +1352,7 @@ int vfs_stat_smb_basename(struct connection_struct *conn,
 	};
 	int ret;
 
-	if (smb_fname.flags & SMB_FILENAME_POSIX_PATH) {
-		ret = SMB_VFS_LSTAT(conn, &smb_fname);
-	} else {
-		ret = SMB_VFS_STAT(conn, &smb_fname);
-	}
-
+	ret = vfs_stat(conn, &smb_fname);
 	if (ret != -1) {
 		*psbuf = smb_fname.st;
 	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list