The branch, master has been updated via 3a360f5 selftest: Also run smbtorture smb2.compound with aio enabled via 508aebf torture: Add testcase for compound CREATE-WRITE-CLOSE request via a2b081e smbd/aio: Do not go async for SMB2 compound requests via cfa2c30 smbd: Move check for SMB2 compound request to new function from 835f506 s3: Fix a small spelling mistake in smbcacls.
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 3a360f552d6641952931d3aa8a9ce85a648de3e1 Author: Christof Schmitt <c...@samba.org> Date: Wed Sep 20 16:13:38 2017 -0700 selftest: Also run smbtorture smb2.compound with aio enabled BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Sep 22 09:49:30 CEST 2017 on sn-devel-144 commit 508aebf40abe83b6319700260c405ada0566a46b Author: Christof Schmitt <c...@samba.org> Date: Wed Sep 20 16:07:50 2017 -0700 torture: Add testcase for compound CREATE-WRITE-CLOSE request BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a2b081e159403e10295a1bc089b48e816ce698b9 Author: Christof Schmitt <c...@samba.org> Date: Thu Sep 21 12:08:01 2017 -0700 smbd/aio: Do not go async for SMB2 compound requests BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit cfa2c3083080016a1288474b8879039db4dbf6b1 Author: Christof Schmitt <c...@samba.org> Date: Thu Sep 21 17:41:25 2017 -0700 smbd: Move check for SMB2 compound request to new function BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: selftest/knownfail | 1 + source3/selftest/tests.py | 4 +++ source3/smbd/aio.c | 8 +++++ source3/smbd/globals.h | 1 + source3/smbd/smb2_read.c | 2 +- source3/smbd/smb2_server.c | 5 +++ source4/torture/smb2/compound.c | 73 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 93 insertions(+), 1 deletion(-) Changeset truncated at 500 lines: diff --git a/selftest/knownfail b/selftest/knownfail index aa89dab..953b181 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -172,6 +172,7 @@ ^samba3.smb2.setinfo.setinfo ^samba3.smb2.session.*reauth5 # some special anonymous checks? ^samba3.smb2.compound.interim2 # wrong return code (STATUS_CANCELLED) +^samba3.smb2.compound.aio.interim2 # wrong return code (STATUS_CANCELLED) ^samba3.smb2.replay.channel-sequence ^samba3.smb2.replay.replay3 ^samba3.smb2.replay.replay4 diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 139bba0..73479fc 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -518,6 +518,10 @@ for t in tests: elif t == "rpc.samr.users.privileges": plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/tmp -U$USERNAME%$PASSWORD --option=torture:nt4_dc=true') plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$USERNAME%$PASSWORD') + elif t == "smb2.compound": + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/tmp -U$USERNAME%$PASSWORD') + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/aio -U$USERNAME%$PASSWORD', 'aio') + plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$USERNAME%$PASSWORD') else: plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/tmp -U$USERNAME%$PASSWORD') plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$USERNAME%$PASSWORD') diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c index f455d04..d3611ba 100644 --- a/source3/smbd/aio.c +++ b/source3/smbd/aio.c @@ -697,6 +697,10 @@ NTSTATUS schedule_smb2_aio_read(connection_struct *conn, return NT_STATUS_RETRY; } + if (smbd_smb2_is_compound(smbreq->smb2req)) { + return NT_STATUS_RETRY; + } + /* Create the out buffer. */ *preadbuf = data_blob_talloc(ctx, NULL, smb_maxcnt); if (preadbuf->data == NULL) { @@ -841,6 +845,10 @@ NTSTATUS schedule_aio_smb2_write(connection_struct *conn, return NT_STATUS_RETRY; } + if (smbd_smb2_is_compound(smbreq->smb2req)) { + return NT_STATUS_RETRY; + } + if (smbreq->unread_bytes) { /* Can't do async with recvfile. */ return NT_STATUS_RETRY; diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index ae5ecf4..78f1260 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -225,6 +225,7 @@ void smbd_server_connection_terminate_ex(struct smbXsrv_connection *xconn, const char *smb2_opcode_name(uint16_t opcode); bool smbd_is_smb2_header(const uint8_t *inbuf, size_t size); +bool smbd_smb2_is_compound(const struct smbd_smb2_request *req); NTSTATUS smbd_add_connection(struct smbXsrv_client *client, int sock_fd, struct smbXsrv_connection **_xconn); diff --git a/source3/smbd/smb2_read.c b/source3/smbd/smb2_read.c index ecedf1e..273c56c 100644 --- a/source3/smbd/smb2_read.c +++ b/source3/smbd/smb2_read.c @@ -350,7 +350,7 @@ static NTSTATUS schedule_smb2_sendfile_read(struct smbd_smb2_request *smb2req, if (!lp__use_sendfile(SNUM(fsp->conn)) || smb2req->do_signing || smb2req->do_encryption || - smb2req->in.vector_count >= (2*SMBD_SMB2_NUM_IOV_PER_REQ) || + smbd_smb2_is_compound(smb2req) || (fsp->base_fsp != NULL) || (fsp->wcp != NULL) || (!S_ISREG(fsp->fsp_name->st.st_ex_mode)) || diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c index d95631f..68a024f 100644 --- a/source3/smbd/smb2_server.c +++ b/source3/smbd/smb2_server.c @@ -204,6 +204,11 @@ bool smbd_is_smb2_header(const uint8_t *inbuf, size_t size) return true; } +bool smbd_smb2_is_compound(const struct smbd_smb2_request *req) +{ + return req->in.vector_count >= (2*SMBD_SMB2_NUM_IOV_PER_REQ); +} + static NTSTATUS smbd_initialize_smb2(struct smbXsrv_connection *xconn, uint64_t expected_seq_low) { diff --git a/source4/torture/smb2/compound.c b/source4/torture/smb2/compound.c index e501870..c592308 100644 --- a/source4/torture/smb2/compound.c +++ b/source4/torture/smb2/compound.c @@ -671,6 +671,77 @@ done: return ret; } +static bool test_compound_create_write_close(struct torture_context *tctx, + struct smb2_tree *tree) +{ + struct smb2_handle handle = { .data = { UINT64_MAX, UINT64_MAX } }; + struct smb2_create create; + struct smb2_write write; + struct smb2_close close; + const char *fname = "compound_create_write_close.dat"; + struct smb2_request *req[3]; + NTSTATUS status; + bool ret = false; + + smb2_util_unlink(tree, fname); + + ZERO_STRUCT(create); + create.in.security_flags = 0x00; + create.in.oplock_level = 0; + create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION; + create.in.create_flags = 0x00000000; + create.in.reserved = 0x00000000; + create.in.desired_access = SEC_RIGHTS_FILE_ALL; + create.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + create.in.share_access = NTCREATEX_SHARE_ACCESS_READ | + NTCREATEX_SHARE_ACCESS_WRITE | + NTCREATEX_SHARE_ACCESS_DELETE; + create.in.create_disposition = NTCREATEX_DISP_OPEN_IF; + create.in.create_options = NTCREATEX_OPTIONS_SEQUENTIAL_ONLY | + NTCREATEX_OPTIONS_ASYNC_ALERT | + NTCREATEX_OPTIONS_NON_DIRECTORY_FILE | + 0x00200000; + create.in.fname = fname; + + smb2_transport_compound_start(tree->session->transport, 3); + + req[0] = smb2_create_send(tree, &create); + + smb2_transport_compound_set_related(tree->session->transport, true); + + ZERO_STRUCT(write); + write.in.file.handle = handle; + write.in.offset = 0; + write.in.data = data_blob_talloc(tctx, NULL, 1024); + + req[1] = smb2_write_send(tree, &write); + + ZERO_STRUCT(close); + close.in.file.handle = handle; + + req[2] = smb2_close_send(tree, &close); + + status = smb2_create_recv(req[0], tree, &create); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "CREATE failed."); + + status = smb2_write_recv(req[1], &write); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "WRITE failed."); + + status = smb2_close_recv(req[2], &close); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "CLOSE failed."); + + status = smb2_util_unlink(tree, fname); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "File deletion failed."); + + ret = true; +done: + return ret; +} + static bool test_compound_unrelated1(struct torture_context *tctx, struct smb2_tree *tree) { @@ -1230,6 +1301,8 @@ struct torture_suite *torture_smb2_compound_init(TALLOC_CTX *ctx) torture_suite_add_1smb2_test(suite, "interim2", test_compound_interim2); torture_suite_add_1smb2_test(suite, "compound-break", test_compound_break); torture_suite_add_1smb2_test(suite, "compound-padding", test_compound_padding); + torture_suite_add_1smb2_test(suite, "create-write-close", + test_compound_create_write_close); suite->description = talloc_strdup(suite, "SMB2-COMPOUND tests"); -- Samba Shared Repository