[SCM] Samba Shared Repository - branch master updated
Michael Adam
obnox at samba.org
Sat Sep 22 12:51:02 MDT 2012
The branch, master has been updated
via 162fbf4 selftest: skip the samba4.smb2.compound testsuite
via 93bee9b s3:smbd:smb2: initialize variable in vfs_default_durable_reconnect()
via 8419346 selftest: we fail samba3.smb2.compound.interim2
via 6f6b1c6 s4:torture:smb2:compound: remove two unused macros
via 8df0b02 s4:torture:smb2: don't skip the compound.interim2 test for non win7/win2k8
via 917e714 s4:torture:smb2: don't skip the compound.interim1 test for non win7/win2k8
via 88d051f s3:smbd: remove struct member smbd_smb2_request.cancelled - it was only written
via 603f9bf s3:smb2_lock: let smbd_smb2_create_cancel() trigger NT_STATUS_CANCELED
via 65a8106 s3:smb2_lock: smbd_smb2_notify_recv() can already return NT_STATUS_CANCELED
via 882cee0 s3:smb2_notify: make use of tevent_req_defer_callback() instead of custom tevent_immediate
via 1f0dfd4 s3:smb2_notify: don't call tevent_req_done() from smbd_smb2_notify_cancel()
via 1f8e473 s3:smb2_lock: let smbd_smb2_lock_cancel() trigger NT_STATUS_CANCELED
via 9249871 s3:smb2_server: avoid segfault in smbd_smb2_request_pending_queue()
via 25437df s4:torture:smb2: extend the compound.invalid1 test
via 1ae6f9c s3:smbd:smb2: simplify smbd_smb2_request_validate() and smbd_smb2_request_dispatch()
via 27d38b5 s3:smbd:smb2: add check for session_status for compound requests
via 4384485 s3:smb2_server: do the req->next_status check before the signing checks
via 2552b66 s3:smb2_server: reset req->last_session_id and req->last_tid after using it
via bd8d50b s4:torture:smb2: fix the compound.invalid3 test to work against windows
via 8e525a2 s4:torture:smb2: fix compound.related3 test to work against windows
via 7595194 s3: Compound requests should continue processing.
from fe2071c build: Fix enabled handling for HAVE_LDAP, we need to use bld.CONFIG_SET
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 162fbf4adbd78af0ca62e01da30e9c8bf86d3b4d
Author: Michael Adam <obnox at samba.org>
Date: Sat Sep 22 19:07:51 2012 +0200
selftest: skip the samba4.smb2.compound testsuite
Too many tests are starting but never finish.
Autobuild-User(master): Michael Adam <obnox at samba.org>
Autobuild-Date(master): Sat Sep 22 20:50:06 CEST 2012 on sn-devel-104
commit 93bee9b3e31b398b9becc7be7804025d4066359b
Author: Michael Adam <obnox at samba.org>
Date: Fri Sep 21 22:56:20 2012 +0200
s3:smbd:smb2: initialize variable in vfs_default_durable_reconnect()
Found by Ambi's state-of-the-art compiler!
commit 841934647b06d6400148932cc8ce02a20c209610
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 20:46:53 2012 +0200
selftest: we fail samba3.smb2.compound.interim2
We currently return NT_STATUS_CANCELLED where we should
return NT_STATUS_INTERNAL_ERROR.
commit 6f6b1c6ac15f225978e8c2d67c1a817d9e098317
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 00:43:54 2012 +0200
s4:torture:smb2:compound: remove two unused macros
commit 8df0b023c51ed198d3054760447e1b273eada991
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 00:41:48 2012 +0200
s4:torture:smb2: don't skip the compound.interim2 test for non win7/win2k8
commit 917e714831178b2a3d07c7f9d09711231a7ccf31
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 00:41:04 2012 +0200
s4:torture:smb2: don't skip the compound.interim1 test for non win7/win2k8
commit 88d051f7f18ff88ec5385fdc798f051659134bd3
Author: Michael Adam <obnox at samba.org>
Date: Sat Sep 22 02:05:18 2012 +0200
s3:smbd: remove struct member smbd_smb2_request.cancelled - it was only written
commit 603f9bfa4cf7910e1c1cae1a8d0741a6d0874baa
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:16:03 2012 +0200
s3:smb2_lock: let smbd_smb2_create_cancel() trigger NT_STATUS_CANCELED
Instead of violating the tevent_req layers.
metze
commit 65a81060093cf9d7c0ebf8d6e160625bdc87baab
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:16:03 2012 +0200
s3:smb2_lock: smbd_smb2_notify_recv() can already return NT_STATUS_CANCELED
That's why we can remove the code that violates the tevent_req layers.
metze
commit 882cee0acb9c1e2105a005f0ea90691197a696c7
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:25:58 2012 +0200
s3:smb2_notify: make use of tevent_req_defer_callback() instead of custom tevent_immediate
metze
commit 1f0dfd42f16c388abc7054a7b615d2e81031472b
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:23:26 2012 +0200
s3:smb2_notify: don't call tevent_req_done() from smbd_smb2_notify_cancel()
smbd_notify_cancel_by_smbreq() will already trigger this via
smbd_smb2_notify_reply() and smbd_smb2_notify_reply_trigger().
metze
commit 1f8e4732c5870043fbbc22c772404b5380f808f0
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:16:03 2012 +0200
s3:smb2_lock: let smbd_smb2_lock_cancel() trigger NT_STATUS_CANCELED
Instead of violating the tevent_req layers.
metze
commit 9249871f40aab021d62d3154f8ca286b52f5ef76
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 16:04:01 2012 +0200
s3:smb2_server: avoid segfault in smbd_smb2_request_pending_queue()
Because we should not call smbd_smb2_request_error() on an
request that is still running.
If the subreq implementes a cancel function, this should
take care of triggering smbd_smb2_request_error.
metze
Signed-off-by: Michael Adam <obnox at samba.org>
commit 25437df8a65e56616499dda18c696f58be08f67a
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Sep 21 22:20:20 2012 +0200
s4:torture:smb2: extend the compound.invalid1 test
Test that when turning the related flag back off for the
last compound request, the return code changes from
invalid parameter to file closed.
Pair-Programmed-With: Michael Adam <obnox at samba.org>
commit 1ae6f9c62629f8513bbe93a56775b3c64ff06832
Author: Michael Adam <obnox at samba.org>
Date: Fri Sep 21 21:43:36 2012 +0200
s3:smbd:smb2: simplify smbd_smb2_request_validate() and smbd_smb2_request_dispatch()
removes unnneccary checks/assignments for compound_related and next_status
and duplicate setting of error status.
And remove (now) unused next_status from struct smbd_smb2_request.
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
commit 27d38b5c27bd96d5124c175d946718bf0836b8f4
Author: Michael Adam <obnox at samba.org>
Date: Sat Sep 22 04:06:27 2012 +0200
s3:smbd:smb2: add check for session_status for compound requests
commit 4384485f82aac109bf4c4c31075e313e54b4c076
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 00:52:19 2012 +0200
s3:smb2_server: do the req->next_status check before the signing checks
Windows 2012 returns NT_STATUS_INVALID_PARAMETER to
the smb2.compound.invalid1 test if that uses signing
(instead of NT_STATUS_ACCESS_DENIED).
metze
commit 2552b6632372b35cbd7b788c4e00091dfe520a41
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Sep 20 05:10:28 2012 +0200
s3:smb2_server: reset req->last_session_id and req->last_tid after using it
If we can find a valid session or tcon we'll set it after the lookup,
but it need to make sure to reset it if we don't find the session.
This fixes a problem where a compound unrelated request between
related requests doesn't reset the session.
If we have 3 requests in a compound chain, request 3 should never
use the id's cached from request 1. It should only every inherit
handles from request 2.
metze
commit bd8d50b451ea7f94efa7777fbe5dc0c2c19f6bf9
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 00:36:29 2012 +0200
s4:torture:smb2: fix the compound.invalid3 test to work against windows
commit 8e525a29a7c6512f61e4647ecb2e0771e2019a49
Author: Michael Adam <obnox at samba.org>
Date: Thu Sep 20 00:35:52 2012 +0200
s4:torture:smb2: fix compound.related3 test to work against windows
commit 75951946193c874b6db30c1b9c8722264c3ce656
Author: Ira Cooper <ira at samba.org>
Date: Wed Sep 19 18:39:07 2012 +0000
s3: Compound requests should continue processing.
This patch addresses #9173.
Signed-off-by: Michael Adam <obnox at samba.org>
-----------------------------------------------------------------------
Summary of changes:
selftest/knownfail | 1 +
selftest/skip | 1 +
source3/smbd/durable.c | 2 +-
source3/smbd/globals.h | 3 -
source3/smbd/smb2_create.c | 17 +------
source3/smbd/smb2_lock.c | 30 +-----------
source3/smbd/smb2_notify.c | 55 +-----------------------
source3/smbd/smb2_read.c | 2 -
source3/smbd/smb2_server.c | 91 +++++++++++----------------------------
source3/smbd/smb2_write.c | 2 -
source4/torture/smb2/compound.c | 30 +++++--------
11 files changed, 47 insertions(+), 187 deletions(-)
Changeset truncated at 500 lines:
diff --git a/selftest/knownfail b/selftest/knownfail
index 59fa2ee..f6835f6 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -204,6 +204,7 @@
^samba3.smb2.getinfo.getinfo
^samba3.smb2.setinfo.setinfo
^samba3.smb2.session.*reauth5 # some special anonymous checks?
+^samba3.smb2.compound.interim2 # wrong return code (STATUS_CANCELLED)
^samba3.raw.session.*reauth2 # maybe fix this?
^samba3.rpc.spoolss.printer.addprinter.driver_info_winreg # knownfail or flapping?
^samba3.rpc.spoolss.printer.addprinterex.driver_info_winreg # knownfail or flapping?
diff --git a/selftest/skip b/selftest/skip
index 174f257..171eee0 100644
--- a/selftest/skip
+++ b/selftest/skip
@@ -57,6 +57,7 @@
^samba4.smb2.durable-v2-open
^samba4.smb2.dir
^samba4.smb2.session
+^samba4.smb2.compound
^samba4.ntvfs.cifs.*.base.charset
^samba4.ntvfs.cifs.*.base.iometer
^samba4.ntvfs.cifs.*.base.casetable
diff --git a/source3/smbd/durable.c b/source3/smbd/durable.c
index 5953e1b..42ad18e 100644
--- a/source3/smbd/durable.c
+++ b/source3/smbd/durable.c
@@ -234,7 +234,7 @@ NTSTATUS vfs_default_durable_reconnect(struct connection_struct *conn,
NTSTATUS status;
bool ok;
int ret;
- int flags;
+ int flags = 0;
struct file_id file_id;
struct smb_filename *smb_fname = NULL;
enum ndr_err_code ndr_err;
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 74e42c7..107d338 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -466,7 +466,6 @@ struct smbd_smb2_request {
bool do_signing;
bool do_encryption;
struct tevent_timer *async_te;
- bool cancelled;
bool compound_related;
/*
@@ -486,8 +485,6 @@ struct smbd_smb2_request {
struct smb_request *smb1req;
struct files_struct *compat_chain_fsp;
- NTSTATUS next_status;
-
/*
* The sub request for async backend calls.
* This is used for SMB2 Cancel.
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index 0d9a146..9318a83 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -284,19 +284,6 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
NTSTATUS status;
NTSTATUS error; /* transport error */
- if (smb2req->cancelled) {
- uint64_t mid = get_mid_from_smb2req(smb2req);
- DEBUG(10,("smbd_smb2_request_create_done: cancelled mid %llu\n",
- (unsigned long long)mid ));
- error = smbd_smb2_request_error(smb2req, NT_STATUS_CANCELLED);
- if (!NT_STATUS_IS_OK(error)) {
- smbd_server_connection_terminate(smb2req->sconn,
- nt_errstr(error));
- return;
- }
- return;
- }
-
status = smbd_smb2_create_recv(tsubreq,
smb2req,
&out_oplock_level,
@@ -1425,9 +1412,9 @@ static bool smbd_smb2_create_cancel(struct tevent_req *req)
remove_deferred_open_entry(state->id, mid,
messaging_server_id(smb2req->sconn->msg_ctx));
remove_deferred_open_message_smb2_internal(smb2req, mid);
- smb2req->cancelled = true;
- tevent_req_done(req);
+ tevent_req_defer_callback(req, smb2req->sconn->ev_ctx);
+ tevent_req_nterror(req, NT_STATUS_CANCELLED);
return true;
}
diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c
index 19e1ef0..e2ea251 100644
--- a/source3/smbd/smb2_lock.c
+++ b/source3/smbd/smb2_lock.c
@@ -134,31 +134,6 @@ static void smbd_smb2_request_lock_done(struct tevent_req *subreq)
NTSTATUS status;
NTSTATUS error; /* transport error */
- if (smb2req->cancelled) {
- const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(smb2req);
- uint64_t mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
- struct smbd_smb2_lock_state *state;
-
- DEBUG(10,("smbd_smb2_request_lock_done: cancelled mid %llu\n",
- (unsigned long long)mid ));
-
- state = tevent_req_data(smb2req->subreq,
- struct smbd_smb2_lock_state);
-
- SMB_ASSERT(state);
- SMB_ASSERT(state->blr);
-
- remove_pending_lock(state, state->blr);
-
- error = smbd_smb2_request_error(smb2req, NT_STATUS_CANCELLED);
- if (!NT_STATUS_IS_OK(error)) {
- smbd_server_connection_terminate(smb2req->sconn,
- nt_errstr(error));
- return;
- }
- return;
- }
-
status = smbd_smb2_lock_recv(subreq);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
@@ -405,9 +380,10 @@ static bool smbd_smb2_lock_cancel(struct tevent_req *req)
}
smb2req = state->smb2req;
- smb2req->cancelled = true;
- tevent_req_done(req);
+ remove_pending_lock(state, state->blr);
+ tevent_req_defer_callback(req, smb2req->sconn->ev_ctx);
+ tevent_req_nterror(req, NT_STATUS_CANCELLED);
return true;
}
diff --git a/source3/smbd/smb2_notify.c b/source3/smbd/smb2_notify.c
index 886bc89..81aa615 100644
--- a/source3/smbd/smb2_notify.c
+++ b/source3/smbd/smb2_notify.c
@@ -28,7 +28,6 @@
struct smbd_smb2_notify_state {
struct smbd_smb2_request *smb2req;
struct smb_request *smbreq;
- struct tevent_immediate *im;
NTSTATUS status;
DATA_BLOB out_output_buffer;
};
@@ -113,24 +112,6 @@ static void smbd_smb2_request_notify_done(struct tevent_req *subreq)
NTSTATUS status;
NTSTATUS error; /* transport error */
- if (req->cancelled) {
- struct smbd_smb2_notify_state *state = tevent_req_data(subreq,
- struct smbd_smb2_notify_state);
- const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req);
- uint64_t mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
-
- DEBUG(10,("smbd_smb2_request_notify_done: cancelled mid %llu\n",
- (unsigned long long)mid ));
- error = smbd_smb2_request_error(req, NT_STATUS_CANCELLED);
- if (!NT_STATUS_IS_OK(error)) {
- smbd_server_connection_terminate(req->sconn,
- nt_errstr(error));
- return;
- }
- TALLOC_FREE(state->im);
- return;
- }
-
status = smbd_smb2_notify_recv(subreq,
req,
&out_output_buffer);
@@ -177,9 +158,6 @@ static void smbd_smb2_request_notify_done(struct tevent_req *subreq)
static void smbd_smb2_notify_reply(struct smb_request *smbreq,
NTSTATUS error_code,
uint8_t *buf, size_t len);
-static void smbd_smb2_notify_reply_trigger(struct tevent_context *ctx,
- struct tevent_immediate *im,
- void *private_data);
static bool smbd_smb2_notify_cancel(struct tevent_req *req);
static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
@@ -205,7 +183,6 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
state->smb2req = smb2req;
state->status = NT_STATUS_INTERNAL_ERROR;
state->out_output_buffer = data_blob_null;
- state->im = NULL;
DEBUG(10,("smbd_smb2_notify_send: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
@@ -275,11 +252,6 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
- state->im = tevent_create_immediate(state);
- if (tevent_req_nomem(state->im, req)) {
- return tevent_req_post(req, ev);
- }
-
/*
* No changes pending, queue the request
*/
@@ -321,30 +293,7 @@ static void smbd_smb2_notify_reply(struct smb_request *smbreq,
}
}
- if (state->im == NULL) {
- smbd_smb2_notify_reply_trigger(NULL, NULL, req);
- return;
- }
-
- /*
- * if this is called async, we need to go via an immediate event
- * because the caller replies on the smb_request (a child of req
- * being arround after calling this function
- */
- tevent_schedule_immediate(state->im,
- state->smb2req->sconn->ev_ctx,
- smbd_smb2_notify_reply_trigger,
- req);
-}
-
-static void smbd_smb2_notify_reply_trigger(struct tevent_context *ctx,
- struct tevent_immediate *im,
- void *private_data)
-{
- struct tevent_req *req = talloc_get_type_abort(private_data,
- struct tevent_req);
- struct smbd_smb2_notify_state *state = tevent_req_data(req,
- struct smbd_smb2_notify_state);
+ tevent_req_defer_callback(req, state->smb2req->sconn->ev_ctx);
if (!NT_STATUS_IS_OK(state->status)) {
tevent_req_nterror(req, state->status);
@@ -361,8 +310,6 @@ static bool smbd_smb2_notify_cancel(struct tevent_req *req)
smbd_notify_cancel_by_smbreq(state->smbreq);
- state->smb2req->cancelled = true;
- tevent_req_done(req);
return true;
}
diff --git a/source3/smbd/smb2_read.c b/source3/smbd/smb2_read.c
index e0c615a..2890f86 100644
--- a/source3/smbd/smb2_read.c
+++ b/source3/smbd/smb2_read.c
@@ -363,8 +363,6 @@ static bool smbd_smb2_read_cancel(struct tevent_req *req)
tevent_req_data(req,
struct smbd_smb2_read_state);
- state->smb2req->cancelled = true;
-
return cancel_smb2_aio(state->smbreq);
}
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index fd90b2f..dcaefb1 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -713,7 +713,6 @@ static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req)
struct iovec *hdr = SMBD_SMB2_IDX_HDR_IOV(req,in,idx);
struct iovec *body = SMBD_SMB2_IDX_BODY_IOV(req,in,idx);
const uint8_t *inhdr = NULL;
- uint32_t flags;
if (hdr->iov_len != SMB2_HDR_BODY) {
return NT_STATUS_INVALID_PARAMETER;
@@ -733,50 +732,6 @@ static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req)
if (!smb2_validate_message_id(req->sconn, inhdr)) {
return NT_STATUS_INVALID_PARAMETER;
}
-
- flags = IVAL(inhdr, SMB2_HDR_FLAGS);
- if (idx < SMBD_SMB2_NUM_IOV_PER_REQ) {
- /*
- * the 1st request should never have the
- * SMB2_HDR_FLAG_CHAINED flag set
- */
- if (flags & SMB2_HDR_FLAG_CHAINED) {
- req->next_status = NT_STATUS_INVALID_PARAMETER;
- return NT_STATUS_OK;
- }
- } else if (idx < 2*SMBD_SMB2_NUM_IOV_PER_REQ) {
- /*
- * the 2nd request triggers related vs. unrelated
- * compounded requests
- */
- if (flags & SMB2_HDR_FLAG_CHAINED) {
- req->compound_related = true;
- }
- } else {
-#if 0
- /*
- * It seems the this tests are wrong
- * see the SMB2-COMPOUND test
- */
-
- /*
- * all other requests should match the 2nd one
- */
- if (flags & SMB2_HDR_FLAG_CHAINED) {
- if (!req->compound_related) {
- req->next_status =
- NT_STATUS_INVALID_PARAMETER;
- return NT_STATUS_OK;
- }
- } else {
- if (req->compound_related) {
- req->next_status =
- NT_STATUS_INVALID_PARAMETER;
- return NT_STATUS_OK;
- }
- }
-#endif
- }
}
return NT_STATUS_OK;
@@ -1342,9 +1297,13 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
* request chain. This is not allowed.
* Cancel the outstanding request.
*/
- tevent_req_cancel(req->subreq);
+ bool ok = tevent_req_cancel(req->subreq);
+ if (ok) {
+ return NT_STATUS_OK;
+ }
+ TALLOC_FREE(req->subreq);
return smbd_smb2_request_error(req,
- NT_STATUS_INSUFFICIENT_RESOURCES);
+ NT_STATUS_INTERNAL_ERROR);
}
if (DEBUGLEVEL >= 10) {
@@ -1691,6 +1650,8 @@ static NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req)
in_tid = req->last_tid;
}
+ req->last_tid = 0;
+
status = smb2srv_tcon_lookup(req->session,
in_tid, now, &tcon);
if (!NT_STATUS_IS_OK(status)) {
@@ -1740,6 +1701,8 @@ static NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req)
in_session_id = req->last_session_id;
}
+ req->last_session_id = 0;
+
/* lookup an existing session */
status = smb2srv_session_lookup(req->sconn->conn,
in_session_id, now,
@@ -1994,6 +1957,18 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
}
+ if (flags & SMB2_HDR_FLAG_CHAINED) {
+ /*
+ * This check is mostly for giving the correct error code
+ * for compounded requests.
+ */
+ if (!NT_STATUS_IS_OK(session_status)) {
+ return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+ }
+ } else {
+ req->compat_chain_fsp = NULL;
+ }
+
if (req->do_encryption) {
signing_required = false;
} else if (flags & SMB2_HDR_FLAG_SIGNED) {
@@ -2043,21 +2018,7 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
}
if (flags & SMB2_HDR_FLAG_CHAINED) {
- /*
- * This check is mostly for giving the correct error code
- * for compounded requests.
- *
- * TODO: we may need to move this after the session
- * and tcon checks.
- */
- if (!NT_STATUS_IS_OK(req->next_status)) {
- return smbd_smb2_request_error(req, req->next_status);
- }
- } else {
- req->compat_chain_fsp = NULL;
- }
-
- if (req->compound_related) {
+ req->compound_related = true;
req->sconn->smb2.compound_related_in_progress = true;
}
@@ -2421,6 +2382,7 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req)
}
if (req->compound_related) {
+ req->compound_related = false;
req->sconn->smb2.compound_related_in_progress = false;
}
@@ -2683,10 +2645,9 @@ NTSTATUS smbd_smb2_request_error_ex(struct smbd_smb2_request *req,
}
/*
- * if a request fails, all other remaining
- * compounded requests should fail too
+ * Note: Even if there is an error, continue to process the request.
+ * per MS-SMB2.
*/
- req->next_status = NT_STATUS_INVALID_PARAMETER;
return smbd_smb2_request_done_ex(req, status, body, info, __location__);
}
diff --git a/source3/smbd/smb2_write.c b/source3/smbd/smb2_write.c
index 03998ca..f9cfbfc 100644
--- a/source3/smbd/smb2_write.c
+++ b/source3/smbd/smb2_write.c
@@ -236,8 +236,6 @@ static bool smbd_smb2_write_cancel(struct tevent_req *req)
tevent_req_data(req,
struct smbd_smb2_write_state);
- state->smb2req->cancelled = true;
-
return cancel_smb2_aio(state->smbreq);
}
diff --git a/source4/torture/smb2/compound.c b/source4/torture/smb2/compound.c
index 0eef369..e75f682 100644
--- a/source4/torture/smb2/compound.c
+++ b/source4/torture/smb2/compound.c
@@ -34,9 +34,6 @@
goto done; \
}} while (0)
-#define TARGET_IS_W2K8(_tctx) (torture_setting_bool(_tctx, "w2k8", false))
-#define TARGET_IS_WIN7(_tctx) (torture_setting_bool(_tctx, "win7", false))
-
static bool test_compound_related1(struct torture_context *tctx,
struct smb2_tree *tree)
{
@@ -190,9 +187,9 @@ static bool test_compound_related2(struct torture_context *tctx,
status = smb2_close_recv(req[2], &cl);
CHECK_STATUS(status, NT_STATUS_FILE_CLOSED);
status = smb2_close_recv(req[3], &cl);
- CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+ CHECK_STATUS(status, NT_STATUS_FILE_CLOSED);
status = smb2_close_recv(req[4], &cl);
- CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+ CHECK_STATUS(status, NT_STATUS_FILE_CLOSED);
TALLOC_FREE(tree->smbXcli);
tree->smbXcli = saved_tcon;
@@ -348,9 +345,9 @@ static bool test_compound_invalid1(struct torture_context *tctx,
const char *fname = "compound_invalid1.dat";
struct smb2_close cl;
bool ret = true;
- struct smb2_request *req[2];
+ struct smb2_request *req[3];
- smb2_transport_credits_ask_num(tree->session->transport, 2);
+ smb2_transport_credits_ask_num(tree->session->transport, 3);
smb2_util_unlink(tree, fname);
@@ -374,7 +371,7 @@ static bool test_compound_invalid1(struct torture_context *tctx,
0x00200000;
cr.in.fname = fname;
- smb2_transport_compound_start(tree->session->transport, 2);
+ smb2_transport_compound_start(tree->session->transport, 3);
/* passing the first request with the related flag is invalid */
smb2_transport_compound_set_related(tree->session->transport, true);
@@ -388,11 +385,16 @@ static bool test_compound_invalid1(struct torture_context *tctx,
cl.in.file.handle = hd;
req[1] = smb2_close_send(tree, &cl);
+ smb2_transport_compound_set_related(tree->session->transport, false);
+ req[2] = smb2_close_send(tree, &cl);
+
status = smb2_create_recv(req[0], tree, &cr);
/* TODO: check why this fails with --signing=required */
CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
status = smb2_close_recv(req[1], &cl);
CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+ status = smb2_close_recv(req[2], &cl);
+ CHECK_STATUS(status, NT_STATUS_FILE_CLOSED);
smb2_util_unlink(tree, fname);
--
Samba Shared Repository
More information about the samba-cvs
mailing list