[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