diff options
author | Michael Adam <obnox@samba.org> | 2012-08-08 12:44:01 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2012-08-09 16:22:53 +0200 |
commit | 523602863a7ad5bca4026cd72f146a3eace8f1fe (patch) | |
tree | e2ccef2c318a37414c448c428e790df4e5d439a7 | |
parent | db160bf5100b7c8bd7a1712c76354b30cd7c4925 (diff) | |
download | samba-523602863a7ad5bca4026cd72f146a3eace8f1fe.tar.gz samba-523602863a7ad5bca4026cd72f146a3eace8f1fe.tar.bz2 samba-523602863a7ad5bca4026cd72f146a3eace8f1fe.zip |
s3:torture:delete: add a 12th subtest to the delete-on-close tests
test whether second open is possible with initial delete on close
and how setting and unsetting delete on close on the handle affects
the initial delete on close (it does not...)
-rw-r--r-- | source3/torture/torture.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/source3/torture/torture.c b/source3/torture/torture.c index e0570c5dc6..69e583ad55 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -4291,6 +4291,104 @@ static bool run_deletetest(int dummy) printf("eleventh delete on close test succeeded.\n"); + /* + * Test 12 + * like test 4 but with initial delete on close + */ + + cli_setatr(cli1, fname, 0, 0); + cli_unlink(cli1, fname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); + + status = cli_ntcreate(cli1, fname, 0, + FILE_READ_DATA|FILE_WRITE_DATA|DELETE_ACCESS, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OVERWRITE_IF, + FILE_DELETE_ON_CLOSE, 0, &fnum1); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] open 1 of %s failed (%s)\n", fname, nt_errstr(status)); + goto fail; + } + + status = cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + FILE_OPEN, 0, 0, &fnum2); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] open 2 of %s failed(%s).\n", fname, nt_errstr(status)); + goto fail; + } + + status = cli_close(cli1, fnum2); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] close 1 failed (%s)\n", nt_errstr(status)); + goto fail; + } + + status = cli_nt_delete_on_close(cli1, fnum1, true); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] setting delete_on_close failed (%s)\n", nt_errstr(status)); + goto fail; + } + + /* This should fail - no more opens once delete on close set. */ + status = cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + FILE_OPEN, 0, 0, &fnum2); + if (NT_STATUS_IS_OK(status)) { + printf("[12] open 3 of %s succeeded - should fail).\n", fname); + goto fail; + } + + status = cli_nt_delete_on_close(cli1, fnum1, false); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] unsetting delete_on_close failed (%s)\n", nt_errstr(status)); + goto fail; + } + + status = cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + FILE_OPEN, 0, 0, &fnum2); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] open 4 of %s failed (%s)\n", fname, nt_errstr(status)); + goto fail; + } + + status = cli_close(cli1, fnum2); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] close 2 failed (%s)\n", nt_errstr(status)); + goto fail; + } + + status = cli_close(cli1, fnum1); + if (!NT_STATUS_IS_OK(status)) { + printf("[12] close 3 failed (%s)\n", nt_errstr(status)); + goto fail; + } + + /* + * setting delete on close on the handle does + * not unset the initial delete on close... + */ + status = cli_ntcreate(cli1, fname, 0, GENERIC_READ_ACCESS, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + FILE_OPEN, 0, 0, &fnum2); + if (NT_STATUS_IS_OK(status)) { + printf("[12] open 5 of %s succeeded - should fail).\n", fname); + goto fail; + } else if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { + printf("ntcreate returned %s, expected " + "NT_STATUS_OBJECT_NAME_NOT_FOUND\n", + nt_errstr(status)); + goto fail; + } + + printf("twelfth delete on close test succeeded.\n"); + + printf("finished delete test\n"); correct = true; |