diff options
-rw-r--r-- | source4/torture/raw/open.c | 77 | ||||
-rw-r--r-- | source4/torture/torture.c | 33 |
2 files changed, 109 insertions, 1 deletions
diff --git a/source4/torture/raw/open.c b/source4/torture/raw/open.c index 7c575fbe9a..f559632f23 100644 --- a/source4/torture/raw/open.c +++ b/source4/torture/raw/open.c @@ -740,6 +740,79 @@ done: return ret; } +/* + test RAW_OPEN_NTCREATEX with an already opened and byte range locked file + + I've got an application that does a similar sequence of ntcreate&x, + locking&x and another ntcreate&x with + open_disposition==NTCREATEX_DISP_OVERWRITE_IF. Windows 2003 allows the + second open. +*/ +static BOOL test_ntcreatex_brlocked(struct cli_state *cli, TALLOC_CTX *mem_ctx) +{ + union smb_open io, io1; + union smb_lock io2; + struct smb_lock_entry lock[1]; + const char *fname = BASEDIR "\\torture_ntcreatex.txt"; + NTSTATUS status; + BOOL ret = True; + + /* reasonable default parameters */ + io.generic.level = RAW_OPEN_NTCREATEX; + io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; + io.ntcreatex.in.root_fid = 0; + io.ntcreatex.in.access_mask = 0x2019f; + io.ntcreatex.in.alloc_size = 0; + io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; + io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | + NTCREATEX_SHARE_ACCESS_WRITE; + io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; + io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE; + io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; + io.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC | + NTCREATEX_SECURITY_ALL; + io.ntcreatex.in.fname = fname; + + status = smb_raw_open(cli->tree, mem_ctx, &io); + CHECK_STATUS(status, NT_STATUS_OK); + + io2.lockx.level = RAW_LOCK_LOCKX; + io2.lockx.in.fnum = io.ntcreatex.out.fnum; + io2.lockx.in.mode = LOCKING_ANDX_LARGE_FILES; + io2.lockx.in.timeout = 0; + io2.lockx.in.ulock_cnt = 0; + io2.lockx.in.lock_cnt = 1; + lock[0].pid = cli->session->pid; + lock[0].offset = 0; + lock[0].count = 0x1; + io2.lockx.in.locks = &lock[0]; + status = smb_raw_lock(cli->tree, &io2); + CHECK_STATUS(status, NT_STATUS_OK); + + io1.generic.level = RAW_OPEN_NTCREATEX; + io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; + io1.ntcreatex.in.root_fid = 0; + io1.ntcreatex.in.access_mask = 0x20196; + io1.ntcreatex.in.alloc_size = 0; + io1.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; + io1.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | + NTCREATEX_SHARE_ACCESS_WRITE; + io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF; + io1.ntcreatex.in.create_options = 0; + io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; + io1.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC | + NTCREATEX_SECURITY_ALL; + io1.ntcreatex.in.fname = fname; + + status = smb_raw_open(cli->tree, mem_ctx, &io1); + CHECK_STATUS(status, NT_STATUS_OK); + + done: + cli_close(cli->tree, io.ntcreatex.out.fnum); + cli_close(cli->tree, io1.ntcreatex.out.fnum); + cli_unlink(cli->tree, fname); + return ret; +} /* test RAW_OPEN_MKNEW @@ -917,6 +990,10 @@ BOOL torture_raw_open(int dummy) return False; } + if (!test_ntcreatex_brlocked(cli, mem_ctx)) { + return False; + } + if (!test_open(cli, mem_ctx)) { ret = False; } diff --git a/source4/torture/torture.c b/source4/torture/torture.c index 09ab503274..78674990e8 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -1489,6 +1489,8 @@ static BOOL run_locktest7(int dummy) struct cli_state *cli1; const char *fname = "\\lockt7.lck"; int fnum1; + int fnum2; + size_t size; char buf[200]; BOOL correct = False; @@ -1603,11 +1605,38 @@ static BOOL run_locktest7(int dummy) goto fail; } - cli_unlock(cli1->tree, fnum1, 130, 0); + printf("Testing truncate of locked file.\n"); + + fnum2 = cli_open(cli1->tree, fname, O_RDWR|O_TRUNC, DENY_NONE); + + if (fnum2 == -1) { + printf("Unable to truncate locked file.\n"); + correct = False; + goto fail; + } else { + printf("Truncated locked file.\n"); + } + + if (NT_STATUS_IS_ERR(cli_getatr(cli1->tree, fname, NULL, &size, NULL))) { + printf("getatr failed (%s)\n", cli_errstr(cli1->tree)); + correct = False; + goto fail; + } + + if (size != 0) { + printf("Unable to truncate locked file. Size was %u\n", size); + correct = False; + goto fail; + } + + cli1->session->pid = 1; + + cli_unlock(cli1->tree, fnum1, 130, 4); correct = True; fail: cli_close(cli1->tree, fnum1); + cli_close(cli1->tree, fnum2); cli_unlink(cli1->tree, fname); torture_close_connection(cli1); @@ -3225,7 +3254,9 @@ error_test60: } printf("non-io open test #7 passed.\n"); + error_test70: + cli_unlink(cli1->tree, fname); if (!torture_close_connection(cli1)) { |