[SCM] Samba Shared Repository - branch master updated

Ralph Böhme slow at samba.org
Fri Sep 2 15:57:01 UTC 2022


The branch, master has been updated
       via  3a37e4155c3 smbd: Catch streams on non-stream shares
       via  201e1969bf3 smbd: return NT_STATUS_OBJECT_NAME_INVALID if a share doesn't support streams
       via  3dcdab86f13 smbtorture: add a test trying to create a stream on share without streams support
      from  a5156649d58 tests: Test basic handling of SMB2_CREATE_TAG_POSIX

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


- Log -----------------------------------------------------------------
commit 3a37e4155c3cd82388652f89b611f2c46fee8525
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Sep 2 11:46:53 2022 +0200

    smbd: Catch streams on non-stream shares
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15126
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15161
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Ralph Böhme <slow at samba.org>
    Autobuild-Date(master): Fri Sep  2 15:56:56 UTC 2022 on sn-devel-184

commit 201e1969bf31af07e8bd52876ff7f4d72b48a848
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Sep 2 12:09:53 2022 +0200

    smbd: return NT_STATUS_OBJECT_NAME_INVALID if a share doesn't support streams
    
    This is what a Windows server returns. Tested with a share residing on a FAT
    formatted drive, a Windows filesystem that doesn't support streams.
    
    Combinations tested:
    
      file::$DATA
      file:stream
      file:stream:$DATA
    
    All three fail with NT_STATUS_OBJECT_NAME_INVALID.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15126
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15161
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 3dcdab86f13fabb7a8c6ce71c59a565287d11244
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Sep 1 18:55:23 2022 +0200

    smbtorture: add a test trying to create a stream on share without streams support
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15126
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15161
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

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

Summary of changes:
 source3/selftest/tests.py     |  2 ++
 source3/smbd/filename.c       |  6 ++++++
 source3/smbd/files.c          | 10 +++++++--
 source3/smbd/open.c           |  2 +-
 source4/selftest/tests.py     |  1 +
 source4/torture/smb2/create.c | 48 +++++++++++++++++++++++++++++++++++++++++++
 source4/torture/smb2/smb2.c   |  1 +
 7 files changed, 67 insertions(+), 3 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 25f8fa56c58..82f24dbdfab 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -1097,6 +1097,8 @@ for t in tests:
     elif t == "smb2.twrp":
         # This is being driven by samba3.blackbox.shadow_copy_torture
         pass
+    elif t == "smb2.create_no_streams":
+        plansmbtorture4testsuite(t, "fileserver", '//$SERVER_IP/nfs4acl_simple_40 -U$USERNAME%$PASSWORD')
     elif t == "rpc.wkssvc":
         plansmbtorture4testsuite(t, "ad_member", '//$SERVER/tmp -U$DC_USERNAME%$DC_PASSWORD')
     elif t == "rpc.srvsvc":
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index ca94b7ec7f9..0be8e320ffa 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1120,6 +1120,12 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
 		goto fail;
 	}
 
+	if ((streamname != NULL) &&
+	    ((conn->fs_capabilities & FILE_NAMED_STREAMS) == 0)) {
+		status = NT_STATUS_OBJECT_NAME_INVALID;
+		goto fail;
+	}
+
 	if (!posix) {
 		bool name_has_wild = ms_has_wild(dirname);
 		name_has_wild |= ms_has_wild(fname_rel);
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 095a01723b1..e7c83505328 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -565,8 +565,14 @@ NTSTATUS openat_pathref_fsp(const struct files_struct *dirfsp,
 		return NT_STATUS_OK;
 	}
 
-	if (!(conn->fs_capabilities & FILE_NAMED_STREAMS) ||
-	    !is_named_stream(smb_fname)) {
+	if (is_named_stream(smb_fname) &&
+	    ((conn->fs_capabilities & FILE_NAMED_STREAMS) == 0)) {
+		DBG_DEBUG("stream open [%s] on non-stream share\n",
+			  smb_fname_str_dbg(smb_fname));
+		return NT_STATUS_OBJECT_NAME_INVALID;
+	}
+
+	if (!is_named_stream(smb_fname)) {
 		/*
 		 * openat_pathref_fullname() will make "full_fname" a
 		 * talloc child of the smb_fname->fsp. Don't use
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index db0cb47d34d..d443a0291f9 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -6316,7 +6316,7 @@ NTSTATUS create_file_default(connection_struct *conn,
 		}
 
 		if (!(conn->fs_capabilities & FILE_NAMED_STREAMS)) {
-			status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
+			status = NT_STATUS_OBJECT_NAME_INVALID;
 			goto fail;
 		}
 	}
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index df712ec0020..54906ae589c 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -389,6 +389,7 @@ smb2_s3only = [
     "smb2.async_dosmode",
     "smb2.twrp",
     "smb2.ea",
+    "smb2.create_no_streams",
 ]
 smb2 = [x for x in smbtorture4_testsuites("smb2.") if x not in smb2_s3only]
 
diff --git a/source4/torture/smb2/create.c b/source4/torture/smb2/create.c
index 9277488e9d7..9357528909e 100644
--- a/source4/torture/smb2/create.c
+++ b/source4/torture/smb2/create.c
@@ -3979,3 +3979,51 @@ struct torture_suite *torture_smb2_bench_init(TALLOC_CTX *ctx)
 
 	return suite;
 }
+
+static bool test_no_stream(struct torture_context *tctx,
+			   struct smb2_tree *tree)
+{
+	struct smb2_create c;
+	NTSTATUS status;
+	bool ret = true;
+	const char *names[] = {
+		"test_no_stream::$DATA",
+		"test_no_stream::foooooooooooo",
+		"test_no_stream:stream",
+		"test_no_stream:stream:$DATA",
+		NULL
+	};
+	int i;
+
+	for (i = 0; names[i] != NULL; i++) {
+		c = (struct smb2_create) {
+			.in.desired_access = SEC_FLAG_MAXIMUM_ALLOWED,
+			.in.file_attributes = FILE_ATTRIBUTE_NORMAL,
+			.in.create_disposition = NTCREATEX_DISP_OPEN,
+			.in.share_access = NTCREATEX_SHARE_ACCESS_MASK,
+			.in.fname = names[i],
+		};
+
+		status = smb2_create(tree, tctx, &c);
+		if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_INVALID)) {
+			torture_comment(
+				tctx, "Expected NT_STATUS_OBJECT_NAME_INVALID, "
+				"got %s, name: '%s'\n",
+				nt_errstr(status), names[i]);
+			torture_fail_goto(tctx, done, "Bad create result\n");
+		}
+	}
+done:
+	return ret;
+}
+
+struct torture_suite *torture_smb2_create_no_streams_init(TALLOC_CTX *ctx)
+{
+	struct torture_suite *suite = torture_suite_create(ctx, "create_no_streams");
+
+	torture_suite_add_1smb2_test(suite, "no_stream", test_no_stream);
+
+	suite->description = talloc_strdup(suite, "SMB2-CREATE stream test on share without streams support");
+
+	return suite;
+}
diff --git a/source4/torture/smb2/smb2.c b/source4/torture/smb2/smb2.c
index 458561adac3..f61a2bf96f8 100644
--- a/source4/torture/smb2/smb2.c
+++ b/source4/torture/smb2/smb2.c
@@ -215,6 +215,7 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
 	torture_suite_add_1smb2_test(suite, "session-id", run_sessidtest);
 	torture_suite_add_suite(suite, torture_smb2_deny_init(suite));
 	torture_suite_add_suite(suite, torture_smb2_ea(suite));
+	torture_suite_add_suite(suite, torture_smb2_create_no_streams_init(suite));
 
 	suite->description = talloc_strdup(suite, "SMB2-specific tests");
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list