📄 delete.c
字号:
torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__); smbcli_close(cli2->tree, fnum2); smbcli_close(cli1->tree, fnum1); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_FILE_READ_EA, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, 0, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); smbcli_close(cli1->tree, fnum1); fnum1 = smbcli_nt_create_full(cli1->tree, fname_new, 0, SEC_FILE_READ_EA, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, 0, 0); torture_assert(tctx, fnum1 == -1, "smbcli_open succeeded, should have " "failed"); return correct;}/* Test 16 ... */static bool deltest16(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){ int fnum1 = -1; int fnum2 = -1; bool correct = true; del_clean_area(cli1, cli2); /* Test 16. */ /* Ensure the file doesn't already exist. */ smbcli_close(cli1->tree, fnum1); smbcli_close(cli1->tree, fnum2); smbcli_setatr(cli1->tree, fname, 0, 0); smbcli_unlink(cli1->tree, fname); /* Firstly create with all access, but delete on close. */ fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_RIGHTS_FILE_ALL, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_CREATE, NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0); torture_assert (tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); /* The delete on close bit is *not* reported as being set. */ correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__); /* The delete on close bit is *not* reported as being set. */ correct &= check_delete_on_close(tctx, cli1, -1, fname, false, __location__); correct &= check_delete_on_close(tctx, cli2, -1, fname, false, __location__); /* Now try opening again for read-only. */ fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, 0, 0); /* Should work. */ torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__); correct &= check_delete_on_close(tctx, cli1, -1, fname, false, __location__); correct &= check_delete_on_close(tctx, cli2, fnum2, fname, false, __location__); correct &= check_delete_on_close(tctx, cli2, -1, fname, false, __location__); smbcli_close(cli1->tree, fnum1); correct &= check_delete_on_close(tctx, cli2, fnum2, fname, true, __location__); correct &= check_delete_on_close(tctx, cli2, -1, fname, true, __location__); smbcli_close(cli2->tree, fnum2); /* And the file should be deleted ! */ fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE); torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail)", fname)); return correct;}/* Test 17 ... */static bool deltest17(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){ int fnum1 = -1; int fnum2 = -1; bool correct = true; del_clean_area(cli1, cli2); /* Test 17. */ /* Ensure the file doesn't already exist. */ smbcli_close(cli1->tree, fnum1); smbcli_close(cli1->tree, fnum2); smbcli_setatr(cli1->tree, fname, 0, 0); smbcli_unlink(cli1->tree, fname); /* Firstly open and create with all access */ fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_RIGHTS_FILE_ALL, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_CREATE, 0, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); /* And close - just to create the file. */ smbcli_close(cli1->tree, fnum1); /* Next open with all access, but add delete on close. */ fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_RIGHTS_FILE_ALL, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); /* The delete on close bit is *not* reported as being set. */ correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__); /* Now try opening again for read-only. */ fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_RIGHTS_FILE_READ| SEC_STD_DELETE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, 0, 0); /* Should work. */ torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); /* still not reported as being set on either */ correct &= check_delete_on_close(tctx, cli1, fnum1, fname, false, __location__); correct &= check_delete_on_close(tctx, cli1, fnum2, fname, false, __location__); smbcli_close(cli1->tree, fnum1); correct &= check_delete_on_close(tctx, cli1, fnum2, fname, false, __location__); smbcli_close(cli1->tree, fnum2); /* See if the file is deleted - shouldn't be.... */ fnum1 = smbcli_open(cli1->tree, fname, O_RDWR, DENY_NONE); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open of %s failed (should succeed) - %s", fname, smbcli_errstr(cli1->tree))); return correct;}/* Test 18 ... */static bool deltest18(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){ int fnum1 = -1; int fnum2 = -1; bool correct = true; del_clean_area(cli1, cli2); /* Test 18. With directories. */ /* Ensure the file doesn't already exist. */ smbcli_close(cli1->tree, fnum1); smbcli_close(cli1->tree, fnum2); smbcli_deltree(cli1->tree, dname); /* Firstly create with all access, but delete on close. */ fnum1 = smbcli_nt_create_full(cli1->tree, dname, 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|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", dname, smbcli_errstr(cli1->tree))); /* The delete on close bit is *not* reported as being set. */ correct &= check_delete_on_close(tctx, cli1, fnum1, dname, false, __location__); /* Now try opening again for read-only. */ fnum2 = smbcli_nt_create_full(cli1->tree, dname, 0, SEC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_DIRECTORY, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, NTCREATEX_OPTIONS_DIRECTORY, 0); /* Should work. */ torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", dname, smbcli_errstr(cli1->tree))); correct &= check_delete_on_close(tctx, cli1, fnum1, dname, false, __location__); correct &= check_delete_on_close(tctx, cli1, fnum2, dname, false, __location__); smbcli_close(cli1->tree, fnum1); correct &= check_delete_on_close(tctx, cli1, fnum2, dname, true, __location__); smbcli_close(cli1->tree, fnum2); /* And the directory should be deleted ! */ fnum1 = smbcli_nt_create_full(cli1->tree, dname, 0, SEC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_DIRECTORY, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, NTCREATEX_OPTIONS_DIRECTORY, 0); torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail)", dname)); return correct;}/* Test 19 ... */static bool deltest19(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){ int fnum1 = -1; int fnum2 = -1; bool correct = true; del_clean_area(cli1, cli2); /* Test 19. */ smbcli_deltree(cli1->tree, dname); /* Firstly open and create with all access */ fnum1 = smbcli_nt_create_full(cli1->tree, dname, 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); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", dname, smbcli_errstr(cli1->tree))); /* And close - just to create the directory. */ smbcli_close(cli1->tree, fnum1); /* Next open with all access, but add delete on close. */ fnum1 = smbcli_nt_create_full(cli1->tree, dname, 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, NTCREATEX_OPTIONS_DIRECTORY|NTCREATEX_OPTIONS_DELETE_ON_CLOSE, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", fname, smbcli_errstr(cli1->tree))); /* The delete on close bit is *not* reported as being set. */ correct &= check_delete_on_close(tctx, cli1, fnum1, dname, false, __location__); /* Now try opening again for read-only. */ fnum2 = smbcli_nt_create_full(cli1->tree, dname, 0, SEC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_DIRECTORY, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, NTCREATEX_OPTIONS_DIRECTORY, 0); /* Should work. */ torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "open - 1 of %s failed (%s)", dname, smbcli_errstr(cli1->tree))); smbcli_close(cli1->tree, fnum1); correct &= check_delete_on_close(tctx, cli1, fnum2, dname, true, __location__); smbcli_close(cli1->tree, fnum2); /* See if the file is deleted - for a directory this seems to be true ! */ fnum1 = smbcli_nt_create_full(cli1->tree, dname, 0, SEC_RIGHTS_FILE_READ, FILE_ATTRIBUTE_DIRECTORY, NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, NTCREATEX_OPTIONS_DIRECTORY, 0); CHECK_STATUS(cli1, NT_STATUS_OBJECT_NAME_NOT_FOUND); torture_assert(tctx, fnum1 == -1, talloc_asprintf(tctx, "open of %s succeeded (should fail)", dname)); return correct;}/* Test 20 ... */static bool deltest20(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2){ int fnum1 = -1; int dnum1 = -1; bool correct = true; NTSTATUS status; del_clean_area(cli1, cli2); /* Test 20 -- non-empty directory hardest to get right... */ if (torture_setting_bool(tctx, "samba3", false)) { return true; } smbcli_deltree(cli1->tree, dname); dnum1 = smbcli_nt_create_full(cli1->tree, dname, 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); torture_assert(tctx, dnum1 != -1, talloc_asprintf(tctx, "open of %s failed: %s!", dname, smbcli_errstr(cli1->tree))); correct &= check_delete_on_close(tctx, cli1, dnum1, dname, false, __location__); status = smbcli_nt_delete_on_close(cli1->tree, dnum1, true); { char *fullname;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -