The branch, master has been updated
via 9fc9e48 smbd: Fix some typos
via f9bbb1f smbd: Remove an unused variable
via 7d71e8d smbd: Clarify smb2 lock checks
via 4709373 torture: Add a check to verify MS-SMB2 3.3.5.14.2
from 0a7290c libcli: Remove an unused variable
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 9fc9e4869f1ddcfeea1e286f9caeb8e8a6cc3a9a
Author: Volker Lendecke <[email protected]>
Date: Mon Jun 30 08:32:29 2014 +0000
smbd: Fix some typos
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
Autobuild-User(master): Jeremy Allison <[email protected]>
Autobuild-Date(master): Wed Jul 2 02:25:47 CEST 2014 on sn-devel-104
commit f9bbb1ff0dc4677d9fd17205cd901ffe8c84011a
Author: Volker Lendecke <[email protected]>
Date: Mon Jun 30 09:44:26 2014 +0000
smbd: Remove an unused variable
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 7d71e8d6575f6893b590f1a86c34541ebbb74740
Author: Volker Lendecke <[email protected]>
Date: Mon Jun 30 09:39:20 2014 +0000
smbd: Clarify smb2 lock checks
When reading the code it was not immediately clear to me how one of the
conditions in [MS-SMB2] 3.3.5.14.2 was satisfied. A separate loop to me
is clearer and given that we don't expect thousands of locks in a single
call also not significantly less efficient.
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 4709373cdf75d9a84eaaf1f23cf4bf07b8cb63c5
Author: Volker Lendecke <[email protected]>
Date: Mon Jun 30 09:37:47 2014 +0000
torture: Add a check to verify MS-SMB2 3.3.5.14.2
If we have more than one lock and there is any blocking lock, we need
to fail with NT_STATUS_INVALID_PARAMETER. At a quick glance I did not
find this tested, so add it.
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
selftest/knownfail | 1 +
source3/smbd/smb2_lock.c | 30 +++++++++++++++++++++---------
source4/torture/smb2/lock.c | 6 ++++++
3 files changed, 28 insertions(+), 9 deletions(-)
Changeset truncated at 500 lines:
diff --git a/selftest/knownfail b/selftest/knownfail
index 434ce0c..deeb8fa 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -115,6 +115,7 @@
^samba4.smb2.oplock.doc
^samba4.smb2.compound.related3
^samba4.smb2.compound.compound-break
+^samba4.smb2.lock.valid-request
^samba4.*base.delaywrite.*update of write time and SMBwrite truncate\(.*\)$
^samba4.*base.delaywrite.*update of write time and SMBwrite truncate
expand\(.*\)$
^samba4.*base.delaywrite.*delayed update of write time 3a\(.*\)$
diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c
index 23b9913..c25e064 100644
--- a/source3/smbd/smb2_lock.c
+++ b/source3/smbd/smb2_lock.c
@@ -235,6 +235,24 @@ static struct tevent_req *smbd_smb2_lock_send(TALLOC_CTX
*mem_ctx,
return tevent_req_post(req, ev);
}
+ if (!isunlock && (in_lock_count > 1)) {
+
+ /*
+ * 3.3.5.14.2 says we SHOULD fail with INVALID_PARAMETER if we
+ * have more than one lock and one of those is blocking.
+ */
+
+ for (i=0; i<in_lock_count; i++) {
+ uint32_t flags = in_locks[i].flags;
+
+ if ((flags & SMB2_LOCK_FLAG_FAIL_IMMEDIATELY) == 0) {
+ tevent_req_nterror(
+ req, NT_STATUS_INVALID_PARAMETER);
+ return tevent_req_post(req, ev);
+ }
+ }
+ }
+
for (i=0; i<in_lock_count; i++) {
bool invalid = false;
@@ -245,11 +263,6 @@ static struct tevent_req *smbd_smb2_lock_send(TALLOC_CTX
*mem_ctx,
invalid = true;
break;
}
- if (i > 0) {
- tevent_req_nterror(req,
- NT_STATUS_INVALID_PARAMETER);
- return tevent_req_post(req, ev);
- }
break;
case SMB2_LOCK_FLAG_SHARED|SMB2_LOCK_FLAG_FAIL_IMMEDIATELY:
@@ -270,8 +283,8 @@ static struct tevent_req *smbd_smb2_lock_send(TALLOC_CTX
*mem_ctx,
default:
if (isunlock) {
/*
- * is the first element was a UNLOCK
- * we need to deferr the error response
+ * If the first element was a UNLOCK
+ * we need to defer the error response
* to the backend, because we need to process
* all unlock elements before
*/
@@ -539,7 +552,7 @@ static bool recalc_smb2_brl_timeout(struct
smbd_server_connection *sconn)
}
/****************************************************************
- Get an SMB2 lock reqeust to go async. lock_timeout should
+ Get an SMB2 lock request to go async. lock_timeout should
always be -1 here.
*****************************************************************/
@@ -648,7 +661,6 @@ bool push_blocking_lock_request_smb2( struct
byte_range_lock *br_lck,
static void remove_pending_lock(struct smbd_smb2_lock_state *state,
struct blocking_lock_record *blr)
{
- int i;
struct byte_range_lock *br_lck = brl_get_locks(
state, blr->fsp);
diff --git a/source4/torture/smb2/lock.c b/source4/torture/smb2/lock.c
index a27ae90..1886a56 100644
--- a/source4/torture/smb2/lock.c
+++ b/source4/torture/smb2/lock.c
@@ -274,6 +274,12 @@ static bool test_valid_request(struct torture_context
*torture,
CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
lck.in.lock_count = 2;
+ el[0].flags = SMB2_LOCK_FLAG_SHARED|SMB2_LOCK_FLAG_FAIL_IMMEDIATELY;
+ el[1].flags = SMB2_LOCK_FLAG_SHARED;
+ status = smb2_lock(tree, &lck);
+ CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
+
+ lck.in.lock_count = 2;
el[0].flags = 0;
el[1].flags = 0;
status = smb2_lock(tree, &lck);
--
Samba Shared Repository