summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2013-09-25 16:02:20 -0700
committerStefan Metzmacher <metze@samba.org>2013-10-23 11:51:19 +0200
commit9d3e3a736cad0d1f22f71f108231bae1bd2ece19 (patch)
tree7fd54baa49831c7b9704a440510e79f968c8d021
parent96faaf6c1ed818fc0aadcb478e9f8b20568d7547 (diff)
downloadsamba-9d3e3a736cad0d1f22f71f108231bae1bd2ece19.tar.gz
samba-9d3e3a736cad0d1f22f71f108231bae1bd2ece19.tar.bz2
samba-9d3e3a736cad0d1f22f71f108231bae1bd2ece19.zip
torture: Add oplock break to l2/none tests
The level we have to break to depends on the create disposition of the second opener. If it's overwriting, break to none. If it's not, break to level2. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r--selftest/knownfail4
-rw-r--r--source4/torture/raw/oplock.c96
-rw-r--r--source4/torture/smb2/oplock.c83
3 files changed, 183 insertions, 0 deletions
diff --git a/selftest/knownfail b/selftest/knownfail
index 83e244b91d..b364e9c0b1 100644
--- a/selftest/knownfail
+++ b/selftest/knownfail
@@ -62,6 +62,7 @@
^samba3.raw.acls nfs4acl_xattr-special.inherit_creator_owner\(s3dc\)
^samba3.raw.acls nfs4acl_xattr-special.inherit_creator_group\(s3dc\)
^samba3.raw.oplock.exclusive5
+^samba3.raw.oplock.exclusive9
^samba3.base.delete.deltest16a
^samba3.base.delete.deltest17a
^samba3.unix.whoami anonymous connection.whoami\(plugin_s4_dc\) # We need to resolve if we should be including SID_NT_WORLD and SID_NT_NETWORK in this token
@@ -142,6 +143,7 @@
^samba4.raw.oplock.*.batch22 # bug 6963
^samba4.raw.oplock.*.doc1
^samba4.raw.oplock.*.exclusive5
+^samba4.raw.oplock.*.exclusive9
^samba4.raw.lock.*.zerobyteread # bug 6974
^samba4.smb2.lock.*.zerobyteread # bug 6974
^samba4.raw.streams.*.delete
@@ -161,6 +163,7 @@
^samba4.smb2.oplock.exclusive2\(.*\)$ # samba 4 oplocks are a mess
^samba4.smb2.oplock.exclusive5\(.*\)$ # samba 4 oplocks are a mess
^samba4.smb2.oplock.exclusive6\(.*\)$ # samba 4 oplocks are a mess
+^samba4.smb2.oplock.exclusive9\(.*\)$
^samba4.smb2.oplock.brl3\(.*\)$ # samba 4 oplocks are a mess
^samba4.smb2.oplock.levelii500\(.*\)$ # samba 4 oplocks are a mess
^samba4.smb2.oplock.brl1\(.*\)$ # samba 4 oplocks are a mess
@@ -208,6 +211,7 @@
^samba3.smb2.lease.multibreak
^samba3.smb2.lease.v2_request
^samba3.smb2.oplock.batch20
+^samba3.smb2.oplock.exclusive9
^samba3.smb2.oplock.stream1
^samba3.smb2.streams.rename
^samba3.smb2.streams.rename2
diff --git a/source4/torture/raw/oplock.c b/source4/torture/raw/oplock.c
index 02b976ce60..11e325e955 100644
--- a/source4/torture/raw/oplock.c
+++ b/source4/torture/raw/oplock.c
@@ -971,6 +971,100 @@ done:
return ret;
}
+static bool test_raw_oplock_exclusive9(struct torture_context *tctx,
+ struct smbcli_state *cli1,
+ struct smbcli_state *cli2)
+{
+ const char *fname = BASEDIR "\\test_exclusive9.dat";
+ NTSTATUS status;
+ bool ret = true;
+ union smb_open io;
+ uint16_t fnum=0, fnum2=0;
+ int i;
+
+ struct {
+ uint32_t create_disposition;
+ uint32_t break_level;
+ } levels[] = {
+ { NTCREATEX_DISP_SUPERSEDE, OPLOCK_BREAK_TO_NONE },
+ { NTCREATEX_DISP_OPEN, OPLOCK_BREAK_TO_LEVEL_II },
+ { NTCREATEX_DISP_OVERWRITE_IF, OPLOCK_BREAK_TO_NONE },
+ { NTCREATEX_DISP_OPEN_IF, OPLOCK_BREAK_TO_LEVEL_II },
+ };
+
+ if (!torture_setup_dir(cli1, BASEDIR)) {
+ return false;
+ }
+
+ /* cleanup */
+ smbcli_unlink(cli1->tree, fname);
+
+ smbcli_oplock_handler(cli1->transport, oplock_handler_ack_to_given,
+ cli1->tree);
+ smbcli_oplock_handler(cli2->transport, oplock_handler_ack_to_given,
+ cli1->tree);
+
+ /*
+ base ntcreatex parms
+ */
+ io.generic.level = RAW_OPEN_NTCREATEX;
+ io.ntcreatex.in.root_fid.fnum = 0;
+ io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
+ io.ntcreatex.in.alloc_size = 0;
+ io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+ io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+ io.ntcreatex.in.create_options = 0;
+ io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+ io.ntcreatex.in.security_flags = 0;
+ io.ntcreatex.in.fname = fname;
+
+ ZERO_STRUCT(break_info);
+ smbcli_oplock_handler(cli1->transport, oplock_handler_ack_to_given,
+ cli1->tree);
+
+ for (i=0; i<ARRAY_SIZE(levels); i++) {
+
+ io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED |
+ NTCREATEX_FLAGS_REQUEST_OPLOCK;
+ io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE|
+ NTCREATEX_SHARE_ACCESS_DELETE;
+ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+ status = smb_raw_open(cli1->tree, tctx, &io);
+ CHECK_STATUS(tctx, status, NT_STATUS_OK);
+ fnum = io.ntcreatex.out.file.fnum;
+ CHECK_VAL(io.ntcreatex.out.oplock_level,
+ EXCLUSIVE_OPLOCK_RETURN);
+
+ ZERO_STRUCT(break_info);
+
+ io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED |
+ NTCREATEX_FLAGS_REQUEST_OPLOCK;
+ io.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
+ io.ntcreatex.in.open_disposition =
+ levels[i].create_disposition;
+ status = smb_raw_open(cli2->tree, tctx, &io);
+ CHECK_STATUS(tctx, status, NT_STATUS_OK);
+ fnum2 = io.ntcreatex.out.file.fnum;
+ CHECK_VAL(io.ntcreatex.out.oplock_level,
+ LEVEL_II_OPLOCK_RETURN);
+ torture_wait_for_oplock_break(tctx);
+ CHECK_VAL(break_info.count, 1);
+ CHECK_VAL(break_info.level, levels[i].break_level);
+ CHECK_VAL(break_info.failures, 0);
+
+ smbcli_close(cli1->tree, fnum);
+ smbcli_close(cli2->tree, fnum2);
+ }
+
+done:
+ smb_raw_exit(cli1->session);
+ smb_raw_exit(cli2->session);
+ smbcli_deltree(cli1->tree, BASEDIR);
+ return ret;
+}
+
static bool test_raw_oplock_batch1(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2)
{
const char *fname = BASEDIR "\\test_batch1.dat";
@@ -4087,6 +4181,8 @@ struct torture_suite *torture_raw_oplock(TALLOC_CTX *mem_ctx)
torture_suite_add_2smb_test(suite, "exclusive7", test_raw_oplock_exclusive7);
torture_suite_add_2smb_test(suite, "exclusive8",
test_raw_oplock_exclusive8);
+ torture_suite_add_2smb_test(suite, "exclusive9",
+ test_raw_oplock_exclusive9);
torture_suite_add_2smb_test(suite, "batch1", test_raw_oplock_batch1);
torture_suite_add_2smb_test(suite, "batch2", test_raw_oplock_batch2);
torture_suite_add_2smb_test(suite, "batch3", test_raw_oplock_batch3);
diff --git a/source4/torture/smb2/oplock.c b/source4/torture/smb2/oplock.c
index 5070d009b3..fb737fe25f 100644
--- a/source4/torture/smb2/oplock.c
+++ b/source4/torture/smb2/oplock.c
@@ -827,6 +827,87 @@ static bool test_smb2_oplock_exclusive6(struct torture_context *tctx,
return ret;
}
+static bool test_smb2_oplock_exclusive9(struct torture_context *tctx,
+ struct smb2_tree *tree1,
+ struct smb2_tree *tree2)
+{
+ const char *fname = BASEDIR "\\test_exclusive9.dat";
+ NTSTATUS status;
+ bool ret = true;
+ union smb_open io;
+ struct smb2_handle h1, h2;
+ int i;
+
+ struct {
+ uint32_t create_disposition;
+ uint32_t break_level;
+ } levels[] = {
+ { NTCREATEX_DISP_SUPERSEDE, SMB2_OPLOCK_LEVEL_NONE },
+ { NTCREATEX_DISP_OPEN, SMB2_OPLOCK_LEVEL_II },
+ { NTCREATEX_DISP_OVERWRITE_IF, SMB2_OPLOCK_LEVEL_NONE },
+ { NTCREATEX_DISP_OPEN_IF, SMB2_OPLOCK_LEVEL_II },
+ };
+
+
+ status = torture_smb2_testdir(tree1, BASEDIR, &h1);
+ torture_assert_ntstatus_ok(tctx, status, "Error creating directory");
+ smb2_util_close(tree1, h1);
+
+ /* cleanup */
+ smb2_util_unlink(tree1, fname);
+
+ tree1->session->transport->oplock.handler = torture_oplock_handler;
+ tree1->session->transport->oplock.private_data = tree1;
+
+ /*
+ base ntcreatex parms
+ */
+ ZERO_STRUCT(io.smb2);
+ io.generic.level = RAW_OPEN_SMB2;
+ io.smb2.in.desired_access = SEC_RIGHTS_FILE_ALL;
+ io.smb2.in.alloc_size = 0;
+ io.smb2.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
+ io.smb2.in.share_access = NTCREATEX_SHARE_ACCESS_READ |
+ NTCREATEX_SHARE_ACCESS_WRITE | NTCREATEX_SHARE_ACCESS_DELETE;
+ io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
+ io.smb2.in.create_options = 0;
+ io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
+ io.smb2.in.security_flags = 0;
+ io.smb2.in.fname = fname;
+
+ for (i=0; i<ARRAY_SIZE(levels); i++) {
+
+ io.smb2.in.create_flags = NTCREATEX_FLAGS_EXTENDED;
+ io.smb2.in.oplock_level = SMB2_OPLOCK_LEVEL_EXCLUSIVE;
+
+ status = smb2_create(tree1, tctx, &(io.smb2));
+ torture_assert_ntstatus_ok(tctx, status,
+ "Error opening the file");
+ h1 = io.smb2.out.file.handle;
+ CHECK_VAL(io.smb2.out.oplock_level,
+ SMB2_OPLOCK_LEVEL_EXCLUSIVE);
+
+ ZERO_STRUCT(break_info);
+
+ io.smb2.in.create_disposition = levels[i].create_disposition;
+ status = smb2_create(tree2, tctx, &(io.smb2));
+ torture_assert_ntstatus_ok(tctx, status,
+ "Error opening the file");
+ h2 = io.smb2.out.file.handle;
+ CHECK_VAL(io.smb2.out.oplock_level, SMB2_OPLOCK_LEVEL_II);
+
+ CHECK_VAL(break_info.count, 1);
+ CHECK_VAL(break_info.level, levels[i].break_level);
+ CHECK_VAL(break_info.failures, 0);
+
+ smb2_util_close(tree2, h2);
+ smb2_util_close(tree1, h1);
+ }
+
+ smb2_deltree(tree1, BASEDIR);
+ return ret;
+}
+
static bool test_smb2_oplock_batch1(struct torture_context *tctx,
struct smb2_tree *tree1,
struct smb2_tree *tree2)
@@ -3410,6 +3491,8 @@ struct torture_suite *torture_smb2_oplocks_init(void)
torture_suite_add_2smb2_test(suite, "exclusive4", test_smb2_oplock_exclusive4);
torture_suite_add_2smb2_test(suite, "exclusive5", test_smb2_oplock_exclusive5);
torture_suite_add_2smb2_test(suite, "exclusive6", test_smb2_oplock_exclusive6);
+ torture_suite_add_2smb2_test(suite, "exclusive9",
+ test_smb2_oplock_exclusive9);
torture_suite_add_2smb2_test(suite, "batch1", test_smb2_oplock_batch1);
torture_suite_add_2smb2_test(suite, "batch2", test_smb2_oplock_batch2);
torture_suite_add_2smb2_test(suite, "batch3", test_smb2_oplock_batch3);