[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