diff options
author | Volker Lendecke <vlendec@samba.org> | 2005-07-06 14:56:45 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:19:18 -0500 |
commit | 824f5b47818fd4cc7fe0084bf454bb31930c4f38 (patch) | |
tree | d9cb6c58d4bd3777bcb3ee22199f9258195ce8bb /source4 | |
parent | 520427119c684483697b0d6672700c08aff4c1da (diff) | |
download | samba-824f5b47818fd4cc7fe0084bf454bb31930c4f38.tar.gz samba-824f5b47818fd4cc7fe0084bf454bb31930c4f38.tar.bz2 samba-824f5b47818fd4cc7fe0084bf454bb31930c4f38.zip |
r8185: Delete on close on directories:
Creating a file in a directory with delete-on-close set returns
DELETE_PENDING, and trying to set the flag on a non-empty directory returns
DIRECTORY_NOT_EMPTY.
Volker
(This used to be commit 5680f34778b2f5291936f4d4fb937a7713696c52)
Diffstat (limited to 'source4')
-rw-r--r-- | source4/torture/basic/delete.c | 137 | ||||
-rw-r--r-- | source4/torture/raw/search.c | 9 |
2 files changed, 142 insertions, 4 deletions
diff --git a/source4/torture/basic/delete.c b/source4/torture/basic/delete.c index d4d196968a..e28561db37 100644 --- a/source4/torture/basic/delete.c +++ b/source4/torture/basic/delete.c @@ -39,6 +39,7 @@ static BOOL check_delete_on_close(struct smbcli_state *cli, int fnum, status = torture_single_search(cli, mem_ctx, fname, RAW_SEARCH_FULL_DIRECTORY_INFO, + FILE_ATTRIBUTE_DIRECTORY, &data); if (!NT_STATUS_IS_OK(status)) { printf("(%s) single_search failed (%s)\n", @@ -138,8 +139,10 @@ BOOL torture_test_delete(void) struct smbcli_state *cli1; struct smbcli_state *cli2 = NULL; const char *fname = "\\delete.file"; + const char *dirname = "\\delete.dir"; int fnum1 = -1; int fnum2 = -1; + int dnum1 = -1; BOOL correct = True; NTSTATUS status; @@ -149,6 +152,8 @@ BOOL torture_test_delete(void) return False; } + smbcli_deltree(cli1->tree, dirname); + /* Test 1 - this should delete the file on close. */ smbcli_setatr(cli1->tree, fname, 0, 0); @@ -793,9 +798,141 @@ BOOL torture_test_delete(void) } smbcli_close(cli1->tree, fnum1); + smbcli_unlink(cli1->tree, fname); printf("thirteenth delete on close test succeeded.\n"); + /* Test 14 -- directory */ + + dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0, + SEC_FILE_READ_DATA| + SEC_FILE_WRITE_DATA| + SEC_STD_DELETE, + FILE_ATTRIBUTE_DIRECTORY, + NTCREATEX_SHARE_ACCESS_READ| + NTCREATEX_SHARE_ACCESS_WRITE| + NTCREATEX_SHARE_ACCESS_DELETE, + NTCREATEX_DISP_CREATE, 0, 0); + if (dnum1 == -1) { + printf("(%s) open of %s failed: %s!\n", + __location__, dirname, smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + + check_delete_on_close(cli1, dnum1, dirname, False); + if (NT_STATUS_IS_ERR(smbcli_nt_delete_on_close(cli1->tree, dnum1, True))) { + printf("(%s) setting delete_on_close on file failed !\n", + __location__); + correct = False; + goto fail; + } + check_delete_on_close(cli1, dnum1, dirname, True); + smbcli_close(cli1->tree, dnum1); + + /* Now it should be gone... */ + + dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0, + SEC_FILE_READ_DATA| + SEC_FILE_WRITE_DATA| + SEC_STD_DELETE, + FILE_ATTRIBUTE_DIRECTORY, + NTCREATEX_SHARE_ACCESS_READ| + NTCREATEX_SHARE_ACCESS_WRITE| + NTCREATEX_SHARE_ACCESS_DELETE, + NTCREATEX_DISP_OPEN, 0, 0); + if (dnum1 != -1) { + printf("(%s) setting delete_on_close on file succeeded !\n", + __location__); + correct = False; + goto fail; + } + + printf("fourteenth delete on close test succeeded.\n"); + + /* Test 15 -- non-empty directory */ + + dnum1 = smbcli_nt_create_full(cli1->tree, dirname, 0, + SEC_FILE_READ_DATA| + SEC_FILE_WRITE_DATA| + SEC_STD_DELETE, + FILE_ATTRIBUTE_DIRECTORY, + NTCREATEX_SHARE_ACCESS_READ| + NTCREATEX_SHARE_ACCESS_WRITE| + NTCREATEX_SHARE_ACCESS_DELETE, + NTCREATEX_DISP_CREATE, + NTCREATEX_OPTIONS_DIRECTORY, 0); + if (dnum1 == -1) { + printf("(%s) open of %s failed: %s!\n", + __location__, dirname, smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + + check_delete_on_close(cli1, dnum1, dirname, False); + status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True); + + { + char *fullname; + asprintf(&fullname, "\\%s%s", dirname, fname); + fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR, + DENY_NONE); + if (fnum1 != -1) { + printf("(%s) smbcli_open succeeded, should have " + "failed: %s\n", + __location__, smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + + if (!NT_STATUS_EQUAL(smbcli_nt_error(cli1->tree), + NT_STATUS_DELETE_PENDING)) { + printf("(%s) smbcli_open returned %s, expected " + "NT_STATUS_DELETE_PENDING\n", + __location__, smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + } + + status = smbcli_nt_delete_on_close(cli1->tree, dnum1, False); + if (!NT_STATUS_IS_OK(status)) { + printf("(%s) setting delete_on_close on file failed !\n", + __location__); + correct = False; + goto fail; + } + + { + char *fullname; + asprintf(&fullname, "\\%s%s", dirname, fname); + fnum1 = smbcli_open(cli1->tree, fullname, O_CREAT|O_RDWR, + DENY_NONE); + if (fnum1 == -1) { + printf("(%s) smbcli_open failed: %s\n", + __location__, smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + smbcli_close(cli1->tree, fnum1); + } + + status = smbcli_nt_delete_on_close(cli1->tree, dnum1, True); + + if (!NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) { + printf("(%s) setting delete_on_close returned %s, expected " + "NT_STATUS_DIRECTORY_NOT_EMPTY\n", __location__, + smbcli_errstr(cli1->tree)); + correct = False; + goto fail; + } + + smbcli_close(cli1->tree, dnum1); + + /* Now it should be gone... */ + + printf("fifteenth delete on close test succeeded.\n"); + printf("finished delete test\n"); fail: diff --git a/source4/torture/raw/search.c b/source4/torture/raw/search.c index 05fa24c6a2..c3cb76d552 100644 --- a/source4/torture/raw/search.c +++ b/source4/torture/raw/search.c @@ -44,6 +44,7 @@ NTSTATUS torture_single_search(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *pattern, enum smb_search_level level, + uint16_t attrib, union smb_search_data *data) { union smb_search_first io; @@ -55,10 +56,10 @@ NTSTATUS torture_single_search(struct smbcli_state *cli, level == RAW_SEARCH_FFIRST || level == RAW_SEARCH_FUNIQUE) { io.search_first.in.max_count = 1; - io.search_first.in.search_attrib = 0; + io.search_first.in.search_attrib = attrib; io.search_first.in.pattern = pattern; } else { - io.t2ffirst.in.search_attrib = 0; + io.t2ffirst.in.search_attrib = attrib; io.t2ffirst.in.max_count = 1; io.t2ffirst.in.flags = FLAG_TRANS2_FIND_CLOSE; io.t2ffirst.in.storage_type = 0; @@ -145,7 +146,7 @@ static BOOL test_one_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) printf("testing %s\n", levels[i].name); levels[i].status = torture_single_search(cli, mem_ctx, fname, - levels[i].level, + levels[i].level, 0, &levels[i].data); /* see if this server claims to support this level */ @@ -164,7 +165,7 @@ static BOOL test_one_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) } status = torture_single_search(cli, mem_ctx, fname2, - levels[i].level, + levels[i].level, 0, &levels[i].data); expected_status = NT_STATUS_NO_SUCH_FILE; |