[SCM] Samba Shared Repository - branch master updated
Ralph Böhme
slow at samba.org
Thu Jul 15 05:49:01 UTC 2021
The branch, master has been updated
via 447c9380dcb s3: VFS: default. In vfswrap_getxattrat_do_async() always use the pathref fsp.
via 2b4062b4a1f s3: VFS: default. In vfswrap_getxattrat_do_sync() always use the pathref fsp.
via 24dc3ca67a5 s3: VFS: default: Add 'handle' member to struct vfswrap_getxattrat_state
via e0b327f2eb5 s3: VFS: default: Move vfswrap_fgetxattr() before the async versions.
via d1ffcc80642 s3: smbd: Allow "smbd async dosmode = yes" to return valid DOS attributes again.
via 8f8d0eaad68 s3: tests: Add "SMB2-LIST-DIR-ASYNC" test.
via 6e7ffa8da34 s3: tests: Our tests for "smbd async dosmode = yes" haven't been working correctly as the parameter has been set incorrectly.
from c5cd5c9d57b WHATSNEW: add client/server smb3 signing/encryption algorithms
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 447c9380dcb2dac20512d20833f611399fc54ef1
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 11:23:54 2021 -0700
s3: VFS: default. In vfswrap_getxattrat_do_async() always use the pathref fsp.
This is always called via a path that mandates
smb_fname->fsp is valid.
https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
Autobuild-User(master): Ralph Böhme <slow at samba.org>
Autobuild-Date(master): Thu Jul 15 05:48:05 UTC 2021 on sn-devel-184
commit 2b4062b4a1fffd3329c27ea7a840b04cf2069669
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 11:23:03 2021 -0700
s3: VFS: default. In vfswrap_getxattrat_do_sync() always use the pathref fsp.
This is always called via a path that mandates
smb_fname->fsp is valid.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 24dc3ca67a5593954fa13fad56ca3aaf8c1a15c8
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 11:35:06 2021 -0700
s3: VFS: default: Add 'handle' member to struct vfswrap_getxattrat_state
Not yet used.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit e0b327f2eb5781a119efde1a2450de4e6d2570e8
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 11:17:49 2021 -0700
s3: VFS: default: Move vfswrap_fgetxattr() before the async versions.
We want to re-use this and don't want to have to add forward
declarations.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit d1ffcc8064294060d05d2b657385f69a75df49cf
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 15:00:13 2021 -0700
s3: smbd: Allow "smbd async dosmode = yes" to return valid DOS attributes again.
We already have a valid smb_fname->fsp, don't drop
it when returning from smbd_dirptr_lanman2_entry()
to allow it to be reused inside dos_mode_at_send().
Remove knownfail.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 8f8d0eaad68620561eb5bdc95fbb855b90f31fc5
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 15:29:01 2021 -0700
s3: tests: Add "SMB2-LIST-DIR-ASYNC" test.
Add as knownfail.
Shows our "smbd async dosmode" code wasn't working.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 6e7ffa8da34b85ac27396ee3fe29afb5db534e9e
Author: Jeremy Allison <jra at samba.org>
Date: Wed Jul 14 15:26:42 2021 -0700
s3: tests: Our tests for "smbd async dosmode = yes" haven't been working correctly as the parameter has been set incorrectly.
If must be "smbd async dosmode", not "smbd:async dosmode"
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
-----------------------------------------------------------------------
Summary of changes:
selftest/target/Samba3.pm | 20 ++++----
source3/modules/vfs_catia.c | 2 +-
source3/modules/vfs_default.c | 113 +++++++++++++++++++-----------------------
source3/selftest/tests.py | 16 ++++++
source3/smbd/trans2.c | 28 ++++++-----
source3/torture/proto.h | 1 +
source3/torture/test_smb2.c | 84 +++++++++++++++++++++++++++++++
source3/torture/torture.c | 4 ++
8 files changed, 183 insertions(+), 85 deletions(-)
Changeset truncated at 500 lines:
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 054ceb38a09..dc1c14e9628 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -1470,7 +1470,7 @@ sub setup_simpleserver
read only = no
vfs objects = aio_pthread
aio_pthread:aio open = yes
- smbd:async dosmode = no
+ smbd async dosmode = no
[vfs_aio_pthread_async_dosmode_default1]
path = $prefix_abs/share
@@ -1478,7 +1478,7 @@ sub setup_simpleserver
vfs objects = aio_pthread
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
[vfs_aio_pthread_async_dosmode_default2]
path = $prefix_abs/share
@@ -1486,7 +1486,7 @@ sub setup_simpleserver
vfs objects = aio_pthread xattr_tdb
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
[vfs_aio_pthread_async_dosmode_force_sync1]
path = $prefix_abs/share
@@ -1494,7 +1494,7 @@ sub setup_simpleserver
vfs objects = aio_pthread
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
# This simulates non linux systems
smbd:force sync user path safe threadpool = yes
smbd:force sync user chdir safe threadpool = yes
@@ -1507,7 +1507,7 @@ sub setup_simpleserver
vfs objects = aio_pthread xattr_tdb
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
# This simulates non linux systems
smbd:force sync user path safe threadpool = yes
smbd:force sync user chdir safe threadpool = yes
@@ -1834,7 +1834,7 @@ sub setup_fileserver_smb1
read only = no
vfs objects = aio_pthread
aio_pthread:aio open = yes
- smbd:async dosmode = no
+ smbd async dosmode = no
[vfs_aio_pthread_async_dosmode_default1]
path = $prefix_abs/share
@@ -1842,7 +1842,7 @@ sub setup_fileserver_smb1
vfs objects = aio_pthread
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
[vfs_aio_pthread_async_dosmode_default2]
path = $prefix_abs/share
@@ -1850,7 +1850,7 @@ sub setup_fileserver_smb1
vfs objects = aio_pthread xattr_tdb
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
[vfs_aio_pthread_async_dosmode_force_sync1]
path = $prefix_abs/share
@@ -1858,7 +1858,7 @@ sub setup_fileserver_smb1
vfs objects = aio_pthread
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
# This simulates non linux systems
smbd:force sync user path safe threadpool = yes
smbd:force sync user chdir safe threadpool = yes
@@ -1871,7 +1871,7 @@ sub setup_fileserver_smb1
vfs objects = aio_pthread xattr_tdb
store dos attributes = yes
aio_pthread:aio open = yes
- smbd:async dosmode = yes
+ smbd async dosmode = yes
# This simulates non linux systems
smbd:force sync user path safe threadpool = yes
smbd:force sync user chdir safe threadpool = yes
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index bf1c1cd425a..ce5a91c9f10 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -166,7 +166,7 @@ static int catia_connect(struct vfs_handle_struct *handle,
* Unless we have an async implementation of get_dos_attributes turn
* this off.
*/
- lp_do_parameter(SNUM(handle->conn), "smbd:async dosmode", "false");
+ lp_do_parameter(SNUM(handle->conn), "smbd async dosmode", "false");
return SMB_VFS_NEXT_CONNECT(handle, service, user);
}
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 102938e332e..aa7dfe3192f 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -3425,8 +3425,39 @@ static int vfswrap_sys_acl_delete_def_fd(vfs_handle_struct *handle,
Extended attribute operations.
*****************************************************************/
+static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ const char *name,
+ void *value,
+ size_t size)
+{
+ int fd = fsp_get_pathref_fd(fsp);
+
+ if (!fsp->fsp_flags.is_pathref) {
+ return fgetxattr(fd, name, value, size);
+ }
+
+ if (fsp->fsp_flags.have_proc_fds) {
+ const char *p = NULL;
+ char buf[PATH_MAX];
+
+ p = sys_proc_fd_path(fd, buf, sizeof(buf));
+ if (p == NULL) {
+ return -1;
+ }
+
+ return getxattr(p, name, value, size);
+ }
+
+ /*
+ * This is no longer a handle based call.
+ */
+ return getxattr(fsp->fsp_name->base_name, name, value, size);
+}
+
struct vfswrap_getxattrat_state {
struct tevent_context *ev;
+ struct vfs_handle_struct *handle;
files_struct *dir_fsp;
const struct smb_filename *smb_fname;
@@ -3479,6 +3510,7 @@ static struct tevent_req *vfswrap_getxattrat_send(
}
*state = (struct vfswrap_getxattrat_state) {
.ev = ev,
+ .handle = handle,
.dir_fsp = dir_fsp,
.smb_fname = smb_fname,
};
@@ -3577,31 +3609,19 @@ static void vfswrap_getxattrat_do_sync(struct tevent_req *req)
{
struct vfswrap_getxattrat_state *state = tevent_req_data(
req, struct vfswrap_getxattrat_state);
- char *path = NULL;
- char *tofree = NULL;
- char pathbuf[PATH_MAX+1];
- ssize_t pathlen;
- int err;
+ struct files_struct *fsp = state->smb_fname->fsp;
- pathlen = full_path_tos(state->dir_fsp->fsp_name->base_name,
- state->smb_fname->base_name,
- pathbuf,
- sizeof(pathbuf),
- &path,
- &tofree);
- if (pathlen == -1) {
- tevent_req_error(req, ENOMEM);
- return;
+ if (fsp->base_fsp != NULL) {
+ fsp = fsp->base_fsp;
}
- state->xattr_size = getxattr(path,
- state->xattr_name,
- state->xattr_value,
- talloc_array_length(state->xattr_value));
- err = errno;
- TALLOC_FREE(tofree);
+ state->xattr_size = vfswrap_fgetxattr(state->handle,
+ fsp,
+ state->xattr_name,
+ state->xattr_value,
+ talloc_array_length(state->xattr_value));
if (state->xattr_size == -1) {
- tevent_req_error(req, err);
+ tevent_req_error(req, errno);
return;
}
@@ -3616,6 +3636,11 @@ static void vfswrap_getxattrat_do_async(void *private_data)
struct timespec start_time;
struct timespec end_time;
int ret;
+ struct files_struct *fsp = state->smb_fname->fsp;
+
+ if (fsp->base_fsp != NULL) {
+ fsp = fsp->base_fsp;
+ }
PROFILE_TIMESTAMP(&start_time);
SMBPROFILE_BYTES_ASYNC_SET_BUSY(state->profile_bytes);
@@ -3638,17 +3663,11 @@ static void vfswrap_getxattrat_do_async(void *private_data)
goto end_profile;
}
- ret = fchdir(fsp_get_pathref_fd(state->dir_fsp));
- if (ret == -1) {
- state->xattr_size = -1;
- state->vfs_aio_state.error = errno;
- goto end_profile;
- }
-
- state->xattr_size = getxattr(state->name,
- state->xattr_name,
- state->xattr_value,
- talloc_array_length(state->xattr_value));
+ state->xattr_size = vfswrap_fgetxattr(state->handle,
+ fsp,
+ state->xattr_name,
+ state->xattr_value,
+ talloc_array_length(state->xattr_value));
if (state->xattr_size == -1) {
state->vfs_aio_state.error = errno;
}
@@ -3742,36 +3761,6 @@ static ssize_t vfswrap_getxattrat_recv(struct tevent_req *req,
return xattr_size;
}
-static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle,
- struct files_struct *fsp,
- const char *name,
- void *value,
- size_t size)
-{
- int fd = fsp_get_pathref_fd(fsp);
-
- if (!fsp->fsp_flags.is_pathref) {
- return fgetxattr(fd, name, value, size);
- }
-
- if (fsp->fsp_flags.have_proc_fds) {
- const char *p = NULL;
- char buf[PATH_MAX];
-
- p = sys_proc_fd_path(fd, buf, sizeof(buf));
- if (p == NULL) {
- return -1;
- }
-
- return getxattr(p, name, value, size);
- }
-
- /*
- * This is no longer a handle based call.
- */
- return getxattr(fsp->fsp_name->base_name, name, value, size);
-}
-
static ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size)
{
int fd = fsp_get_pathref_fd(fsp);
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 876cd41e486..cf745907219 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -242,6 +242,22 @@ plantestsuite("samba3.smbtorture_s3.plain.%s" % "SMB2-STREAM-ACL",
"",
"-l $LOCAL_PATH"])
+#
+# SMB2-LIST-DIR-ASYNC needs to run against a special share vfs_aio_pthread_async_dosmode_default1
+#
+plantestsuite("samba3.smbtorture_s3.plain.%s" % "SMB2-LIST-DIR-ASYNC",
+ "simpleserver",
+ [os.path.join(samba3srcdir,
+ "script/tests/test_smbtorture_s3.sh"),
+ 'SMB2-LIST-DIR-ASYNC',
+ '//$SERVER_IP/vfs_aio_pthread_async_dosmode_default1',
+ '$USERNAME',
+ '$PASSWORD',
+ smbtorture3,
+ "",
+ "-l $LOCAL_PATH"])
+
+
shares = [
"vfs_aio_pthread_async_dosmode_default1",
"vfs_aio_pthread_async_dosmode_default2",
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index c69e48a4a56..b9e2786eda6 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -2551,23 +2551,27 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
}
if (_smb_fname != NULL) {
- struct smb_filename *name = NULL;
-
- name = synthetic_smb_fname(ctx,
- fname,
- NULL,
- &smb_fname->st,
- smb_fname->twrp,
- 0);
- if (name == NULL) {
+ /*
+ * smb_fname is already talloc'ed off ctx.
+ * We just need to make sure we don't return
+ * any stream_name, and replace base_name
+ * with fname in case base_name got mangled.
+ * This allows us to preserve any smb_fname->fsp
+ * for asynchronous handle lookups.
+ */
+ TALLOC_FREE(smb_fname->stream_name);
+ TALLOC_FREE(smb_fname->base_name);
+ smb_fname->base_name = talloc_strdup(smb_fname, fname);
+
+ if (smb_fname->base_name == NULL) {
TALLOC_FREE(smb_fname);
TALLOC_FREE(fname);
return NT_STATUS_NO_MEMORY;
}
- *_smb_fname = name;
+ *_smb_fname = smb_fname;
+ } else {
+ TALLOC_FREE(smb_fname);
}
-
- TALLOC_FREE(smb_fname);
TALLOC_FREE(fname);
if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
diff --git a/source3/torture/proto.h b/source3/torture/proto.h
index 90363577ad9..4db267c92b0 100644
--- a/source3/torture/proto.h
+++ b/source3/torture/proto.h
@@ -119,6 +119,7 @@ bool run_smb2_path_slash(int dummy);
bool run_smb2_sacl(int dummy);
bool run_smb2_quota1(int dummy);
bool run_smb2_stream_acl(int dummy);
+bool run_list_dir_async_test(int dummy);
bool run_chain3(int dummy);
bool run_local_conv_auth_info(int dummy);
bool run_local_sprintf_append(int dummy);
diff --git a/source3/torture/test_smb2.c b/source3/torture/test_smb2.c
index c7fcb3994ba..b186ea4edac 100644
--- a/source3/torture/test_smb2.c
+++ b/source3/torture/test_smb2.c
@@ -3144,3 +3144,87 @@ bool run_smb2_stream_acl(int dummy)
(void)cli_unlink(cli, fname, 0);
return ret;
}
+
+static NTSTATUS list_fn(struct file_info *finfo,
+ const char *name,
+ void *state)
+{
+ bool *matched = (bool *)state;
+ if (finfo->attr & FILE_ATTRIBUTE_DIRECTORY) {
+ *matched = true;
+ }
+ return NT_STATUS_OK;
+}
+
+/*
+ * Must be run against a share with "smbd async dosmode = yes".
+ * Checks we can return DOS attriutes other than "N".
+ * BUG: https://bugzilla.samba.org/show_bug.cgi?id=14758
+ */
+
+bool run_list_dir_async_test(int dummy)
+{
+ struct cli_state *cli = NULL;
+ NTSTATUS status;
+ const char *dname = "ASYNC_DIR";
+ bool ret = false;
+ bool matched = false;
+
+ printf("SMB2 list dir async\n");
+
+ if (!torture_init_connection(&cli)) {
+ return false;
+ }
+
+ status = smbXcli_negprot(cli->conn,
+ cli->timeout,
+ PROTOCOL_SMB2_02,
+ PROTOCOL_SMB3_11);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("smbXcli_negprot returned %s\n", nt_errstr(status));
+ return false;
+ }
+
+ status = cli_session_setup_creds(cli, torture_creds);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("cli_session_setup returned %s\n", nt_errstr(status));
+ return false;
+ }
+
+ status = cli_tree_connect(cli, share, "?????", NULL);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("cli_tree_connect returned %s\n", nt_errstr(status));
+ return false;
+ }
+
+ /* Ensure directory doesn't exist. */
+ (void)cli_rmdir(cli, dname);
+
+ status = cli_mkdir(cli, dname);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("cli_mkdir %s returned %s\n", dname, nt_errstr(status));
+ return false;
+ }
+
+ status = cli_list(cli,
+ dname,
+ FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_DIRECTORY,
+ list_fn,
+ &matched);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("cli_list %s returned %s\n", dname, nt_errstr(status));
+ goto fail;
+ }
+
+ if (!matched) {
+ printf("Failed to find %s\n", dname);
+ goto fail;
+ }
+
+ ret = true;
+
+ fail:
+
+ (void)cli_rmdir(cli, dname);
+ return ret;
+}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 5deffab6dc2..79a9c65073c 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -15245,6 +15245,10 @@ static struct {
.name = "SMB2-STREAM-ACL",
.fn = run_smb2_stream_acl,
},
+ {
+ .name = "SMB2-LIST-DIR-ASYNC",
+ .fn = run_list_dir_async_test,
+ },
{
.name = "CLEANUP1",
.fn = run_cleanup1,
--
Samba Shared Repository
More information about the samba-cvs
mailing list