diff options
author | Volker Lendecke <vl@samba.org> | 2013-09-25 16:02:20 -0700 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2013-10-23 11:51:19 +0200 |
commit | 9d3e3a736cad0d1f22f71f108231bae1bd2ece19 (patch) | |
tree | 7fd54baa49831c7b9704a440510e79f968c8d021 /source4/torture/raw | |
parent | 96faaf6c1ed818fc0aadcb478e9f8b20568d7547 (diff) | |
download | samba-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>
Diffstat (limited to 'source4/torture/raw')
-rw-r--r-- | source4/torture/raw/oplock.c | 96 |
1 files changed, 96 insertions, 0 deletions
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); |