📄 base.c
字号:
return false; } /* Now test if we can truncate a file opened for readonly. */ fnum1 = smbcli_open(cli1->tree, fname, O_RDONLY|O_TRUNC, DENY_NONE); if (fnum1 == -1) { torture_comment(tctx, "(3) open (2) of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test3); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "close2 failed (%s)\n", smbcli_errstr(cli1->tree)); return false; } /* Ensure size == 0. */ if (NT_STATUS_IS_ERR(smbcli_getatr(cli1->tree, fname, NULL, &fsize, NULL))) { torture_comment(tctx, "(3) getatr failed (%s)\n", smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test3); return false; } if (fsize != 0) { torture_comment(tctx, "(3) file size != 0\n"); CHECK_MAX_FAILURES(error_test3); return false; } torture_comment(tctx, "finished open test 3\n");error_test3: smbcli_unlink(cli1->tree, fname); torture_comment(tctx, "testing ctemp\n"); fnum1 = smbcli_ctemp(cli1->tree, "\\", &tmp_path); if (fnum1 == -1) { torture_comment(tctx, "ctemp failed (%s)\n", smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test4); return false; } torture_comment(tctx, "ctemp gave path %s\n", tmp_path); if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "close of temp failed (%s)\n", smbcli_errstr(cli1->tree)); } if (NT_STATUS_IS_ERR(smbcli_unlink(cli1->tree, tmp_path))) { torture_comment(tctx, "unlink of temp failed (%s)\n", smbcli_errstr(cli1->tree)); }error_test4: /* Test the non-io opens... */ smbcli_setatr(cli2->tree, fname, 0, 0); smbcli_unlink(cli2->tree, fname); torture_comment(tctx, "TEST #1 testing 2 non-io opens (no delete)\n"); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 1 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test10); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 == -1) { torture_comment(tctx, "test 1 open 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test10); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 1 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) { torture_comment(tctx, "test 1 close 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); return false; } torture_comment(tctx, "non-io open test #1 passed.\n");error_test10: smbcli_unlink(cli1->tree, fname); torture_comment(tctx, "TEST #2 testing 2 non-io opens (first with delete)\n"); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 2 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test20); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 == -1) { torture_comment(tctx, "test 2 open 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test20); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 1 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) { torture_comment(tctx, "test 1 close 2 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } torture_comment(tctx, "non-io open test #2 passed.\n");error_test20: smbcli_unlink(cli1->tree, fname); torture_comment(tctx, "TEST #3 testing 2 non-io opens (second with delete)\n"); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 3 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test30); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 == -1) { torture_comment(tctx, "test 3 open 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test30); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 3 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) { torture_comment(tctx, "test 3 close 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); return false; } torture_comment(tctx, "non-io open test #3 passed.\n");error_test30: smbcli_unlink(cli1->tree, fname); torture_comment(tctx, "TEST #4 testing 2 non-io opens (both with delete)\n"); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 4 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test40); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 != -1) { torture_comment(tctx, "test 4 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test40); return false; } torture_comment(tctx, "test 4 open 2 of %s gave %s (correct error should be %s)\n", fname, smbcli_errstr(cli2->tree), "sharing violation"); if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 4 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } torture_comment(tctx, "non-io open test #4 passed.\n");error_test40: smbcli_unlink(cli1->tree, fname); torture_comment(tctx, "TEST #5 testing 2 non-io opens (both with delete - both with file share delete)\n"); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 5 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test50); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 == -1) { torture_comment(tctx, "test 5 open 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test50); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 5 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) { torture_comment(tctx, "test 5 close 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); return false; } torture_comment(tctx, "non-io open test #5 passed.\n");error_test50: torture_comment(tctx, "TEST #6 testing 1 non-io open, one io open\n"); smbcli_unlink(cli1->tree, fname); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 6 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test60); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 == -1) { torture_comment(tctx, "test 6 open 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test60); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 6 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli2->tree, fnum2))) { torture_comment(tctx, "test 6 close 2 of %s failed (%s)\n", fname, smbcli_errstr(cli2->tree)); return false; } torture_comment(tctx, "non-io open test #6 passed.\n");error_test60: torture_comment(tctx, "TEST #7 testing 1 non-io open, one io open with delete\n"); smbcli_unlink(cli1->tree, fname); fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, SEC_FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0, 0); if (fnum1 == -1) { torture_comment(tctx, "test 7 open 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test70); return false; } fnum2 = smbcli_nt_create_full(cli2->tree, fname, 0, SEC_STD_DELETE|SEC_FILE_READ_ATTRIBUTE, FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN_IF, 0, 0); if (fnum2 != -1) { torture_comment(tctx, "test 7 open 2 of %s SUCCEEDED - should have failed (%s)\n", fname, smbcli_errstr(cli2->tree)); CHECK_MAX_FAILURES(error_test70); return false; } torture_comment(tctx, "test 7 open 2 of %s gave %s (correct error should be %s)\n", fname, smbcli_errstr(cli2->tree), "sharing violation"); if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "test 7 close 1 of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } torture_comment(tctx, "non-io open test #7 passed.\n");error_test70: torture_comment(tctx, "TEST #8 testing one normal open, followed by lock, followed by open with truncate\n"); smbcli_unlink(cli1->tree, fname); fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE); if (fnum1 == -1) { torture_comment(tctx, "(8) open (1) of %s failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } /* write 20 bytes. */ memset(buf, '\0', 20); if (smbcli_write(cli1->tree, fnum1, 0, buf, 0, 20) != 20) { torture_comment(tctx, "(8) write failed (%s)\n", smbcli_errstr(cli1->tree)); correct = false; } /* Ensure size == 20. */ if (NT_STATUS_IS_ERR(smbcli_getatr(cli1->tree, fname, NULL, &fsize, NULL))) { torture_comment(tctx, "(8) getatr (1) failed (%s)\n", smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test80); return false; } if (fsize != 20) { torture_comment(tctx, "(8) file size != 20\n"); CHECK_MAX_FAILURES(error_test80); return false; } /* Get an exclusive lock on the open file. */ if (NT_STATUS_IS_ERR(smbcli_lock(cli1->tree, fnum1, 0, 4, 0, WRITE_LOCK))) { torture_comment(tctx, "(8) lock1 failed (%s)\n", smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test80); return false; } fnum2 = smbcli_open(cli1->tree, fname, O_RDWR|O_TRUNC, DENY_NONE); if (fnum1 == -1) { torture_comment(tctx, "(8) open (2) of %s with truncate failed (%s)\n", fname, smbcli_errstr(cli1->tree)); return false; } /* Ensure size == 0. */ if (NT_STATUS_IS_ERR(smbcli_getatr(cli1->tree, fname, NULL, &fsize, NULL))) { torture_comment(tctx, "(8) getatr (2) failed (%s)\n", smbcli_errstr(cli1->tree)); CHECK_MAX_FAILURES(error_test80); return false; } if (fsize != 0) { torture_comment(tctx, "(8) file size != 0\n"); CHECK_MAX_FAILURES(error_test80); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum1))) { torture_comment(tctx, "(8) close1 failed (%s)\n", smbcli_errstr(cli1->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_close(cli1->tree, fnum2))) { torture_comment(tctx, "(8) close1 failed (%s)\n", smbcli_errstr(cli1->tree)); return false; } error_test80: torture_comment(tctx, "open test #8 passed.\n"); smbcli_unlink(cli1->tree, fname); return correct;}/* FIRST_DESIRED_ACCESS 0xf019f */#define FIRST_DESIRED_ACCESS SEC_FILE_READ_DATA|SEC_FILE_WRITE_DATA|SEC_FILE_APPEND_DATA|\ SEC_FILE_READ_EA| /* 0xf */ \ SEC_FILE_WRITE_EA|SEC_FILE_READ_ATTRIBUTE| /* 0x90 */ \ SEC_FILE_WRITE_ATTRIBUTE| /* 0x100 */ \ SEC_STD_DELETE|SEC_STD_READ_CONTROL|\ SEC_STD_WRITE_DAC|SEC_STD_WRITE_OWNER /* 0xf0000 *//* SECOND_DESIRED_ACCESS 0xe0080 */#define SECOND_DESIRED_ACCESS SEC_FILE_READ_ATTRIBUTE| /* 0x80 */ \ SEC_STD_READ_CONTROL|SEC_STD_WRITE_DAC|\ SEC_STD_WRITE_OWNER /* 0xe0000 */#if 0#define THIRD_DESIRED_ACCESS FILE_READ_ATTRIBUTE| /* 0x80 */ \ READ_CONTROL|WRITE_DAC|\ SEC_FILE_READ_DATA|\ WRITE_OWNER /* */#endif/** Test ntcreate calls made by xcopy */static bool run_xcopy(struct torture_context *tctx, struct smbcli_state *cli1){ const char *fname = "\\test.txt"; int fnum1, fnum2; fnum1 = smbcli_nt_create_full(cli1->tree, fname, 0, FIRST_DESIRED_ACCESS, FILE_ATTRIBUTE_ARCHIVE, NTCREATEX_SHARE_ACCESS_NONE, NTCREATEX_DISP_OVERWRITE_IF, 0x4044, 0); torture_assert(tctx, fnum1 != -1, talloc_asprintf(tctx, "First open failed - %s", smbcli_errstr(cli1->tree))); fnum2 = smbcli_nt_create_full(cli1->tree, fname, 0, SECOND_DESIRED_ACCESS, 0, NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE, NTCREATEX_DISP_OPEN, 0x200000, 0); torture_assert(tctx, fnum2 != -1, talloc_asprintf(tctx, "second open failed - %s", smbcli_errstr(cli1->tree))); return true;}static bool run_iometer(struct torture_context *tctx, struct smbcli_state *cli){ const char *fname = "\\iobw.tst"; int fnum; size_t filesize; NTSTATUS status; char buf[2048]; int ops; memset(buf, 0, sizeof(buf)); status = smbcli_getatr(cli->tree, fname, NULL, &filesize, NULL); torture_assert_ntstatus_ok(tctx, status, talloc_asprintf(tctx, "smbcli_getatr failed: %s", nt_errstr(status))); torture_comment(tctx, "size: %d\n", (int)filesize); filesize -= (sizeof(buf) - 1); fnum = smbcli_nt_create_full(cli->tree, fname, 0x16, 0x2019f, 0, 0x3, 3, 0x42, 0x3); torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, "open failed: %s", smbcli_errstr(cli->tree))); ops = 0; while (true) { int i, num_reads, num_writes; num_reads = random() % 10; num_writes = random() % 3; for (i=0; i<num_reads; i++) { ssize_t res; if (ops++ > torture_numops) { return true; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -