[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