[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Mon Jul 7 10:37:04 MDT 2014


The branch, master has been updated
       via  21d09dc torture4: Add trivial epoch test
       via  8b9f96e torture4: Add smb2.lease.nobreakself
       via  b597d47 torture4: Add a test to break a handle twice
       via  296739d torture4: Make sure we copy the parent_lease_key
       via  618b6fd smbd: Use BVAL
      from  eccce07 ctdb-tests: Add a test for ctdb restoredb

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


- Log -----------------------------------------------------------------
commit 21d09dc7b85b57bcfe7cd4f57f7173eb9b3601d4
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jul 4 13:27:17 2014 +0000

    torture4: Add trivial epoch test
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Mon Jul  7 18:36:37 CEST 2014 on sn-devel-104

commit 8b9f96e83b304e291b3f2b7095e9bd9ea2a90981
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Sep 24 10:26:48 2013 -0700

    torture4: Add smb2.lease.nobreakself
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit b597d47241ed56bcc6000d9397f19431c3cc5b96
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Sep 24 17:07:54 2013 -0700

    torture4: Add a test to break a handle twice
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 296739d655db40b8acc68edc3168fb8c81a95c88
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Sep 23 19:41:13 2013 -0700

    torture4: Make sure we copy the parent_lease_key
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 618b6fdef85006904370a1a35ba87c70673ee647
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 3 15:35:33 2014 +0000

    smbd: Use BVAL
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

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

Summary of changes:
 selftest/knownfail           |    4 +
 source3/smbd/trans2.c        |   12 +--
 source4/torture/smb2/lease.c |  264 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 266 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/knownfail b/selftest/knownfail
index 624a5ae..7d1702d 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -200,6 +200,10 @@
 ^samba3.smb2.lease.oplock
 ^samba3.smb2.lease.multibreak
 ^samba3.smb2.lease.v2_request
+^samba3.smb2.lease.v2_request_parent
+^samba3.smb2.lease.break_twice
+^samba3.smb2.lease.nobreakself
+^samba3.smb2.lease.v2_epoch1
 ^samba3.smb2.oplock.batch20
 ^samba3.smb2.oplock.stream1
 ^samba3.smb2.streams.rename
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index a95edf8..9003cc4 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -5167,10 +5167,8 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
 
 			smblctx = (uint64_t)IVAL(pdata, POSIX_LOCK_PID_OFFSET);
 #if defined(HAVE_LONGLONG)
-			offset = (((uint64_t) IVAL(pdata,(POSIX_LOCK_START_OFFSET+4))) << 32) |
-					((uint64_t) IVAL(pdata,POSIX_LOCK_START_OFFSET));
-			count = (((uint64_t) IVAL(pdata,(POSIX_LOCK_LEN_OFFSET+4))) << 32) |
-					((uint64_t) IVAL(pdata,POSIX_LOCK_LEN_OFFSET));
+			offset = BVAL(pdata,POSIX_LOCK_START_OFFSET);
+			count = BVAL(pdata,POSIX_LOCK_LEN_OFFSET);
 #else /* HAVE_LONGLONG */
 			offset = (uint64_t)IVAL(pdata,POSIX_LOCK_START_OFFSET);
 			count = (uint64_t)IVAL(pdata,POSIX_LOCK_LEN_OFFSET);
@@ -5191,10 +5189,8 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
 				SSVAL(pdata, POSIX_LOCK_FLAGS_OFFSET, 0);
 				SIVAL(pdata, POSIX_LOCK_PID_OFFSET, (uint32_t)smblctx);
 #if defined(HAVE_LONGLONG)
-				SIVAL(pdata, POSIX_LOCK_START_OFFSET, (uint32)(offset & 0xFFFFFFFF));
-				SIVAL(pdata, POSIX_LOCK_START_OFFSET + 4, (uint32)((offset >> 32) & 0xFFFFFFFF));
-				SIVAL(pdata, POSIX_LOCK_LEN_OFFSET, (uint32)(count & 0xFFFFFFFF));
-				SIVAL(pdata, POSIX_LOCK_LEN_OFFSET + 4, (uint32)((count >> 32) & 0xFFFFFFFF));
+				SBVAL(pdata, POSIX_LOCK_START_OFFSET, offset);
+				SBVAL(pdata, POSIX_LOCK_LEN_OFFSET, count);
 #else /* HAVE_LONGLONG */
 				SIVAL(pdata, POSIX_LOCK_START_OFFSET, offset);
 				SIVAL(pdata, POSIX_LOCK_LEN_OFFSET, count);
diff --git a/source4/torture/smb2/lease.c b/source4/torture/smb2/lease.c
index 045f994..4326958 100644
--- a/source4/torture/smb2/lease.c
+++ b/source4/torture/smb2/lease.c
@@ -69,7 +69,7 @@
 		CHECK_VAL((__io)->out.lease_response.lease_duration, 0); \
 	} while(0)
 
-#define CHECK_LEASE_V2(__io, __state, __oplevel, __key, __flags)	\
+#define CHECK_LEASE_V2(__io, __state, __oplevel, __key, __flags, __parent) \
 	do {								\
 		if (__oplevel) {					\
 			CHECK_VAL((__io)->out.oplock_level, SMB2_OPLOCK_LEVEL_LEASE); \
@@ -84,6 +84,10 @@
 		}							\
 									\
 		CHECK_VAL((__io)->out.lease_response_v2.lease_flags, __flags); \
+		if (__flags & SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET) { \
+			CHECK_VAL((__io)->out.lease_response_v2.parent_lease_key.data[0], (__parent)); \
+			CHECK_VAL((__io)->out.lease_response_v2.parent_lease_key.data[1], ~(__parent)); \
+		} \
 		CHECK_VAL((__io)->out.lease_response_v2.lease_duration, 0); \
 	} while(0)
 
@@ -768,6 +772,91 @@ static bool test_lease_break(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_lease_nobreakself(struct torture_context *tctx,
+				   struct smb2_tree *tree)
+{
+	TALLOC_CTX *mem_ctx = talloc_new(tctx);
+	struct smb2_create io;
+	struct smb2_lease ls;
+	struct smb2_handle h1, h2;
+	NTSTATUS status;
+	const char *fname = "lease.dat";
+	bool ret = true;
+	uint32_t caps;
+	char c = 0;
+
+	caps = smb2cli_conn_server_capabilities(
+		tree->session->transport->conn);
+	if (!(caps & SMB2_CAP_LEASING)) {
+		torture_skip(tctx, "leases are not supported");
+	}
+
+	smb2_util_unlink(tree, fname);
+
+	/* Win7 is happy to grant RHW leases on files. */
+	smb2_lease_create(&io, &ls, false, fname, LEASE1,
+			  smb2_util_lease_state("R"));
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h1 = io.out.file.handle;
+	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+	CHECK_LEASE(&io, "R", true, LEASE1);
+
+	smb2_lease_create(&io, &ls, false, fname, LEASE2,
+			  smb2_util_lease_state("R"));
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h2 = io.out.file.handle;
+	CHECK_LEASE(&io, "R", true, LEASE2);
+
+	ZERO_STRUCT(break_info);
+
+	tree->session->transport->lease.handler	= torture_lease_handler;
+	tree->session->transport->lease.private_data = tree;
+
+	/* Make sure we don't break ourselves on write */
+
+	status = smb2_util_write(tree, h1, &c, 0, 1);
+	torture_wait_for_lease_break(tctx);
+	CHECK_VAL(break_info.count, 1);
+	CHECK_VAL(break_info.failures, 0);
+	CHECK_BREAK_INFO("R", "", LEASE2);
+
+	/* Try the other way round. First, upgrade LEASE2 to R again */
+
+	smb2_lease_create(&io, &ls, false, fname, LEASE2,
+			  smb2_util_lease_state("R"));
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	CHECK_LEASE(&io, "R", true, LEASE2);
+	smb2_util_close(tree, io.out.file.handle);
+
+	/* Now break LEASE1 via h2 */
+
+	ZERO_STRUCT(break_info);
+	status = smb2_util_write(tree, h2, &c, 0, 1);
+	torture_wait_for_lease_break(tctx);
+	CHECK_VAL(break_info.count, 1);
+	CHECK_VAL(break_info.failures, 0);
+	CHECK_BREAK_INFO("R", "", LEASE1);
+
+	/* .. and break LEASE2 via h1 */
+
+	ZERO_STRUCT(break_info);
+	status = smb2_util_write(tree, h1, &c, 0, 1);
+	torture_wait_for_lease_break(tctx);
+	CHECK_VAL(break_info.count, 1);
+	CHECK_VAL(break_info.failures, 0);
+	CHECK_BREAK_INFO("R", "", LEASE2);
+
+done:
+	smb2_util_close(tree, h2);
+	smb2_util_close(tree, h1);
+	smb2_util_unlink(tree, fname);
+	talloc_free(mem_ctx);
+	return ret;
+}
+
 static void torture_oplock_break_callback(struct smb2_request *req)
 {
 	NTSTATUS status;
@@ -1091,6 +1180,109 @@ static bool test_lease_multibreak(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_lease_v2_request_parent(struct torture_context *tctx,
+					 struct smb2_tree *tree)
+{
+	TALLOC_CTX *mem_ctx = talloc_new(tctx);
+	struct smb2_create io;
+	struct smb2_lease ls;
+	struct smb2_handle h1;
+	uint64_t parent = LEASE2;
+	NTSTATUS status;
+	const char *fname = "lease.dat";
+	bool ret = true;
+
+	smb2_util_unlink(tree, fname);
+
+	ZERO_STRUCT(break_info);
+
+	ZERO_STRUCT(io);
+	smb2_lease_v2_create_share(&io, &ls, false, fname,
+				   smb2_util_share_access("RWD"),
+				   LEASE1, &parent,
+				   smb2_util_lease_state("RHW"),
+				   0);
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h1 = io.out.file.handle;
+	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+	CHECK_LEASE_V2(&io, "RHW", true, LEASE1,
+		       SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET, LEASE2);
+
+ done:
+	smb2_util_close(tree, h1);
+	smb2_util_unlink(tree, fname);
+
+	talloc_free(mem_ctx);
+
+	return ret;
+}
+
+static bool test_lease_break_twice(struct torture_context *tctx,
+				   struct smb2_tree *tree)
+{
+	TALLOC_CTX *mem_ctx = talloc_new(tctx);
+	struct smb2_create io;
+	struct smb2_lease ls;
+	struct smb2_handle h1;
+	NTSTATUS status;
+	const char *fname = "lease.dat";
+	bool ret = true;
+	uint32_t caps;
+
+	caps = smb2cli_conn_server_capabilities(
+		tree->session->transport->conn);
+	if (!(caps & SMB2_CAP_LEASING)) {
+		torture_skip(tctx, "leases are not supported");
+	}
+
+	smb2_util_unlink(tree, fname);
+
+	ZERO_STRUCT(break_info);
+	ZERO_STRUCT(io);
+	ZERO_STRUCT(ls);
+
+	smb2_lease_v2_create_share(
+		&io, &ls, false, fname, smb2_util_share_access("RWD"),
+		LEASE1, NULL, smb2_util_lease_state("RWH"), 0);
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h1 = io.out.file.handle;
+	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+	CHECK_LEASE_V2(&io, "RHW", true, LEASE1, 0, 0);
+
+	tree->session->transport->lease.handler = torture_lease_handler;
+	tree->session->transport->lease.private_data = tree;
+
+	ZERO_STRUCT(break_info);
+
+	smb2_lease_v2_create_share(
+		&io, &ls, false, fname, smb2_util_share_access("R"),
+		LEASE2, NULL, smb2_util_lease_state("RWH"), 0);
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
+	CHECK_BREAK_INFO("RWH", "RW", LEASE1);
+
+	smb2_lease_v2_create_share(
+		&io, &ls, false, fname, smb2_util_share_access("RWD"),
+		LEASE2, NULL, smb2_util_lease_state("RWH"), 0);
+
+	ZERO_STRUCT(break_info);
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	CHECK_BREAK_INFO("RW", "R", LEASE1);
+
+done:
+	smb2_util_close(tree, h1);
+	smb2_util_unlink(tree, fname);
+	talloc_free(mem_ctx);
+	return ret;
+}
+
 static bool test_lease_v2_request(struct torture_context *tctx,
 				  struct smb2_tree *tree)
 {
@@ -1127,7 +1319,7 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	CHECK_STATUS(status, NT_STATUS_OK);
 	h1 = io.out.file.handle;
 	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
-	CHECK_LEASE_V2(&io, "RHW", true, LEASE1, 0);
+	CHECK_LEASE_V2(&io, "RHW", true, LEASE1, 0, 0);
 
 	ZERO_STRUCT(io);
 	smb2_lease_v2_create_share(&io, &ls, true, dname,
@@ -1139,7 +1331,7 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	CHECK_STATUS(status, NT_STATUS_OK);
 	h2 = io.out.file.handle;
 	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_DIRECTORY);
-	CHECK_LEASE_V2(&io, "RH", true, LEASE2, 0);
+	CHECK_LEASE_V2(&io, "RH", true, LEASE2, 0, 0);
 
 	ZERO_STRUCT(io);
 	smb2_lease_v2_create_share(&io, &ls, false, dnamefname,
@@ -1152,7 +1344,7 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	h3 = io.out.file.handle;
 	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
 	CHECK_LEASE_V2(&io, "RHW", true, LEASE3,
-		       SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET);
+		       SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET, LEASE2);
 
 	torture_wait_for_lease_break(tctx);
 	CHECK_VAL(break_info.count, 0);
@@ -1168,7 +1360,7 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	CHECK_STATUS(status, NT_STATUS_OK);
 	h4 = io.out.file.handle;
 	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
-	CHECK_LEASE_V2(&io, "RHW", true, LEASE4, 0);
+	CHECK_LEASE_V2(&io, "RHW", true, LEASE4, 0, 0);
 
 	torture_wait_for_lease_break(tctx);
 	torture_wait_for_lease_break(tctx);
@@ -1188,7 +1380,7 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	CHECK_STATUS(status, NT_STATUS_OK);
 	h5 = io.out.file.handle;
 	CHECK_CREATED(&io, EXISTED, FILE_ATTRIBUTE_DIRECTORY);
-	CHECK_LEASE_V2(&io, "RH", true, LEASE2, 0);
+	CHECK_LEASE_V2(&io, "RH", true, LEASE2, 0, 0);
 	smb2_util_close(tree, h5);
 
 	ZERO_STRUCT(w);
@@ -1225,19 +1417,79 @@ static bool test_lease_v2_request(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_lease_v2_epoch1(struct torture_context *tctx,
+				 struct smb2_tree *tree)
+{
+	TALLOC_CTX *mem_ctx = talloc_new(tctx);
+	struct smb2_create io;
+	struct smb2_lease ls;
+	struct smb2_handle h;
+	const char *fname = "lease.dat";
+	bool ret = true;
+	NTSTATUS status;
+
+	smb2_util_unlink(tree, fname);
+
+	tree->session->transport->lease.handler	= torture_lease_handler;
+	tree->session->transport->lease.private_data = tree;
+	tree->session->transport->oplock.handler = torture_oplock_handler;
+	tree->session->transport->oplock.private_data = tree;
+
+	ZERO_STRUCT(break_info);
+
+	ZERO_STRUCT(io);
+	smb2_lease_v2_create_share(&io, &ls, false, fname,
+				   smb2_util_share_access("RWD"),
+				   LEASE1, NULL,
+				   smb2_util_lease_state("RHW"),
+				   0);
+	ls.lease_epoch = 0x4711;
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h = io.out.file.handle;
+	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+	CHECK_LEASE_V2(&io, "RHW", true, LEASE1, 0, 0);
+	CHECK_VAL(io.out.lease_response_v2.lease_epoch, ls.lease_epoch + 1);
+	smb2_util_close(tree, h);
+	smb2_util_unlink(tree, fname);
+
+	ls.lease_state = smb2_util_lease_state("RH");
+
+	status = smb2_create(tree, mem_ctx, &io);
+	CHECK_STATUS(status, NT_STATUS_OK);
+	h = io.out.file.handle;
+	CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+	CHECK_LEASE_V2(&io, "RH", true, LEASE1, 0, 0);
+	CHECK_VAL(io.out.lease_response_v2.lease_epoch, ls.lease_epoch + 1);
+	smb2_util_close(tree, h);
+
+done:
+	smb2_util_unlink(tree, fname);
+	talloc_free(mem_ctx);
+	return ret;
+}
+
 struct torture_suite *torture_smb2_lease_init(void)
 {
 	struct torture_suite *suite =
 	    torture_suite_create(talloc_autofree_context(), "lease");
 
 	torture_suite_add_1smb2_test(suite, "request", test_lease_request);
+	torture_suite_add_1smb2_test(suite, "break_twice",
+				     test_lease_break_twice);
+	torture_suite_add_1smb2_test(suite, "nobreakself",
+				     test_lease_nobreakself);
 	torture_suite_add_1smb2_test(suite, "upgrade", test_lease_upgrade);
 	torture_suite_add_1smb2_test(suite, "upgrade2", test_lease_upgrade2);
 	torture_suite_add_1smb2_test(suite, "upgrade3", test_lease_upgrade3);
 	torture_suite_add_1smb2_test(suite, "break", test_lease_break);
 	torture_suite_add_1smb2_test(suite, "oplock", test_lease_oplock);
 	torture_suite_add_1smb2_test(suite, "multibreak", test_lease_multibreak);
+	torture_suite_add_1smb2_test(suite, "v2_request_parent",
+				     test_lease_v2_request_parent);
 	torture_suite_add_1smb2_test(suite, "v2_request", test_lease_v2_request);
+	torture_suite_add_1smb2_test(suite, "v2_epoch1", test_lease_v2_epoch1);
 
 	suite->description = talloc_strdup(suite, "SMB2-LEASE tests");
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list