[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Fri Feb 18 20:13:01 UTC 2022
The branch, master has been updated
via 408be543238 s3: smbd: Fix our leases code to return the correct error in the non-dynamic share case.
via ca3896b6f8b s4: torture: Add new SMB2 lease test test_lease_duplicate_open().
via bf22548d11f s4: torture: Add new SMB2 lease test test_lease_duplicate_create().
from a7c3213523d source4/torture: Drop unused variable attribute
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 408be54323861c24b6377b804be4428cf45b471e
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 17 11:12:39 2022 -0800
s3: smbd: Fix our leases code to return the correct error in the non-dynamic share case.
We now return INVALID_PARAMETER when trying to open a
different file with a duplicate lease key on the same
(non-dynamic) share. This will enable us to pass another
Windows test suite leases test.
We now behave the same as Windows10.
Remove knownfail.d/smb2-lease-duplicateopen
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14737
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: David Mulder <dmulder at suse.com>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Fri Feb 18 20:12:12 UTC 2022 on sn-devel-184
commit ca3896b6f8bbcad68f042720feceedfa29ddbd83
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 17 10:58:32 2022 -0800
s4: torture: Add new SMB2 lease test test_lease_duplicate_open().
Checks we return INVALID_PARAMETER when trying to open a
different file with a duplicate lease key on the same share.
Checked against Windows10. Currently fails against smbd
so add knownfail.d/smb2-lease-duplicateopen
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14737
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: David Mulder <dmulder at suse.com>
commit bf22548d11fe67ea3f4ec10dff81773d626e4703
Author: Jeremy Allison <jra at samba.org>
Date: Thu Feb 17 09:58:27 2022 -0800
s4: torture: Add new SMB2 lease test test_lease_duplicate_create().
Checks we return INVALID_PARAMETER when trying to create a
new file with a duplicate lease key on the same share.
Checked against Windows10. Samba already passes this
but we didn't have a test before.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14737
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: David Mulder <dmulder at suse.com>
-----------------------------------------------------------------------
Summary of changes:
source3/smbd/open.c | 38 ++++++++++++-
source4/torture/smb2/lease.c | 124 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 160 insertions(+), 2 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index d32b7b19368..2f7fcfa772a 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -5308,8 +5308,42 @@ static void lease_match_parser(
/* Everything should be the same. */
if (!file_id_equal(&state->id, &f->id)) {
- /* This should catch all dynamic share cases. */
- state->match_status = NT_STATUS_OPLOCK_NOT_GRANTED;
+ /*
+ * The client asked for a lease on a
+ * file that doesn't match the file_id
+ * in the database.
+ *
+ * Maybe this is a dynamic share, i.e.
+ * a share where the servicepath is
+ * different for different users (e.g.
+ * the [HOMES] share.
+ *
+ * If the servicepath is different, but the requested
+ * file name + stream name is the same then this is
+ * a dynamic share, the client is using the same share
+ * name and doesn't know that the underlying servicepath
+ * is different. It was expecting a lease on the
+ * same file. Return NT_STATUS_OPLOCK_NOT_GRANTED
+ * to break leases
+ *
+ * Otherwise the client has messed up, or is
+ * testing our error codes, so return
+ * NT_STATUS_INVALID_PARAMETER.
+ */
+ if (!strequal(f->servicepath, state->servicepath) &&
+ strequal(f->base_name, state->fname->base_name) &&
+ strequal(f->stream_name, state->fname->stream_name))
+ {
+ /*
+ * Name is the same but servicepath is
+ * different, dynamic share. Break leases.
+ */
+ state->match_status =
+ NT_STATUS_OPLOCK_NOT_GRANTED;
+ } else {
+ state->match_status =
+ NT_STATUS_INVALID_PARAMETER;
+ }
break;
}
if (!strequal(f->servicepath, state->servicepath)) {
diff --git a/source4/torture/smb2/lease.c b/source4/torture/smb2/lease.c
index 2da320483fe..43b418c5acf 100644
--- a/source4/torture/smb2/lease.c
+++ b/source4/torture/smb2/lease.c
@@ -4436,6 +4436,126 @@ done:
return ret;
}
+static bool test_lease_duplicate_create(struct torture_context *tctx,
+ struct smb2_tree *tree)
+{
+ TALLOC_CTX *mem_ctx = talloc_new(tctx);
+ struct smb2_create io;
+ struct smb2_lease ls;
+ struct smb2_handle h1 = {{0}};
+ struct smb2_handle h2 = {{0}};
+ NTSTATUS status;
+ const char *fname1 = "duplicate_create1.dat";
+ const char *fname2 = "duplicate_create2.dat";
+ bool ret = true;
+ uint32_t caps;
+
+ caps = smb2cli_conn_server_capabilities(
+ tree->session->transport->conn);
+ if (!(caps & SMB2_CAP_LEASING)) {
+ torture_skip(tctx, "leases are not supported");
+ }
+
+ /* Ensure files don't exist. */
+ smb2_util_unlink(tree, fname1);
+ smb2_util_unlink(tree, fname2);
+
+ /* Create file1 - LEASE1 key. */
+ smb2_lease_create(&io, &ls, false, fname1, LEASE1,
+ smb2_util_lease_state("RWH"));
+ status = smb2_create(tree, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ h1 = io.out.file.handle;
+ CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+ CHECK_LEASE(&io, "RWH", true, LEASE1, 0);
+
+ /*
+ * Create file2 with the same LEASE1 key - this should fail with.
+ * INVALID_PARAMETER.
+ */
+ smb2_lease_create(&io, &ls, false, fname2, LEASE1,
+ smb2_util_lease_state("RWH"));
+ status = smb2_create(tree, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+ smb2_util_close(tree, h1);
+
+done:
+ smb2_util_close(tree, h2);
+ smb2_util_close(tree, h1);
+ smb2_util_unlink(tree, fname1);
+ smb2_util_unlink(tree, fname2);
+ talloc_free(mem_ctx);
+ return ret;
+}
+
+static bool test_lease_duplicate_open(struct torture_context *tctx,
+ struct smb2_tree *tree)
+{
+ TALLOC_CTX *mem_ctx = talloc_new(tctx);
+ struct smb2_create io;
+ struct smb2_lease ls;
+ struct smb2_handle h1 = {{0}};
+ struct smb2_handle h2 = {{0}};
+ NTSTATUS status;
+ const char *fname1 = "duplicate_open1.dat";
+ const char *fname2 = "duplicate_open2.dat";
+ bool ret = true;
+ uint32_t caps;
+
+ caps = smb2cli_conn_server_capabilities(
+ tree->session->transport->conn);
+ if (!(caps & SMB2_CAP_LEASING)) {
+ torture_skip(tctx, "leases are not supported");
+ }
+
+ /* Ensure files don't exist. */
+ smb2_util_unlink(tree, fname1);
+ smb2_util_unlink(tree, fname2);
+
+ /* Create file1 - LEASE1 key. */
+ smb2_lease_create(&io, &ls, false, fname1, LEASE1,
+ smb2_util_lease_state("RWH"));
+ status = smb2_create(tree, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ h1 = io.out.file.handle;
+ CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+ CHECK_LEASE(&io, "RWH", true, LEASE1, 0);
+
+ /* Leave file1 open and leased. */
+
+ /* Create file2 - no lease. */
+ smb2_lease_create(&io, NULL, false, fname2, 0,
+ smb2_util_lease_state("RWH"));
+ status = smb2_create(tree, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ h2 = io.out.file.handle;
+ CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+ /* Close it. */
+ smb2_util_close(tree, h2);
+
+ /*
+ * Try and open file2 with the same LEASE1 key - this should fail with.
+ * INVALID_PARAMETER.
+ */
+ smb2_lease_create(&io, &ls, false, fname2, LEASE1,
+ smb2_util_lease_state("RWH"));
+ status = smb2_create(tree, mem_ctx, &io);
+ CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+ /*
+ * If we did open this is an error, but save off
+ * the handle so we close below.
+ */
+ h2 = io.out.file.handle;
+
+done:
+ smb2_util_close(tree, h2);
+ smb2_util_close(tree, h1);
+ smb2_util_unlink(tree, fname1);
+ smb2_util_unlink(tree, fname2);
+ talloc_free(mem_ctx);
+ return ret;
+}
+
struct torture_suite *torture_smb2_lease_init(TALLOC_CTX *ctx)
{
struct torture_suite *suite =
@@ -4480,6 +4600,10 @@ struct torture_suite *torture_smb2_lease_init(TALLOC_CTX *ctx)
torture_suite_add_1smb2_test(suite, "timeout-disconnect", test_lease_timeout_disconnect);
torture_suite_add_1smb2_test(suite, "rename_wait",
test_lease_rename_wait);
+ torture_suite_add_1smb2_test(suite, "duplicate_create",
+ test_lease_duplicate_create);
+ torture_suite_add_1smb2_test(suite, "duplicate_open",
+ test_lease_duplicate_open);
suite->description = talloc_strdup(suite, "SMB2-LEASE tests");
--
Samba Shared Repository
More information about the samba-cvs
mailing list