📄 base.c
字号:
res = smbcli_read(cli->tree, fnum, buf, random() % filesize, sizeof(buf)); torture_assert(tctx, res == sizeof(buf), talloc_asprintf(tctx, "read failed: %s", smbcli_errstr(cli->tree))); } for (i=0; i<num_writes; i++) { ssize_t res; if (ops++ > torture_numops) { return true; } res = smbcli_write(cli->tree, fnum, 0, buf, random() % filesize, sizeof(buf)); torture_assert(tctx, res == sizeof(buf), talloc_asprintf(tctx, "read failed: %s", smbcli_errstr(cli->tree))); } } return true;}/** tries variants of chkpath */static bool torture_chkpath_test(struct torture_context *tctx, struct smbcli_state *cli){ int fnum; bool ret; torture_comment(tctx, "Testing valid and invalid paths\n"); /* cleanup from an old run */ smbcli_rmdir(cli->tree, "\\chkpath.dir\\dir2"); smbcli_unlink(cli->tree, "\\chkpath.dir\\*"); smbcli_rmdir(cli->tree, "\\chkpath.dir"); if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\chkpath.dir"))) { torture_comment(tctx, "mkdir1 failed : %s\n", smbcli_errstr(cli->tree)); return false; } if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\chkpath.dir\\dir2"))) { torture_comment(tctx, "mkdir2 failed : %s\n", smbcli_errstr(cli->tree)); return false; } fnum = smbcli_open(cli->tree, "\\chkpath.dir\\foo.txt", O_RDWR|O_CREAT|O_EXCL, DENY_NONE); if (fnum == -1) { torture_comment(tctx, "open1 failed (%s)\n", smbcli_errstr(cli->tree)); return false; } smbcli_close(cli->tree, fnum); if (NT_STATUS_IS_ERR(smbcli_chkpath(cli->tree, "\\chkpath.dir"))) { torture_comment(tctx, "chkpath1 failed: %s\n", smbcli_errstr(cli->tree)); ret = false; } if (NT_STATUS_IS_ERR(smbcli_chkpath(cli->tree, "\\chkpath.dir\\dir2"))) { torture_comment(tctx, "chkpath2 failed: %s\n", smbcli_errstr(cli->tree)); ret = false; } if (NT_STATUS_IS_ERR(smbcli_chkpath(cli->tree, "\\chkpath.dir\\foo.txt"))) { ret = check_error(__location__, cli, ERRDOS, ERRbadpath, NT_STATUS_NOT_A_DIRECTORY); } else { torture_comment(tctx, "* chkpath on a file should fail\n"); ret = false; } if (NT_STATUS_IS_ERR(smbcli_chkpath(cli->tree, "\\chkpath.dir\\bar.txt"))) { ret = check_error(__location__, cli, ERRDOS, ERRbadpath, NT_STATUS_OBJECT_NAME_NOT_FOUND); } else { torture_comment(tctx, "* chkpath on a non existent file should fail\n"); ret = false; } if (NT_STATUS_IS_ERR(smbcli_chkpath(cli->tree, "\\chkpath.dir\\dirxx\\bar.txt"))) { ret = check_error(__location__, cli, ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND); } else { torture_comment(tctx, "* chkpath on a non existent component should fail\n"); ret = false; } smbcli_rmdir(cli->tree, "\\chkpath.dir\\dir2"); smbcli_unlink(cli->tree, "\\chkpath.dir\\*"); smbcli_rmdir(cli->tree, "\\chkpath.dir"); return ret;}/* * This is a test to excercise some weird Samba3 error paths. */static bool torture_samba3_errorpaths(struct torture_context *tctx){ bool nt_status_support; struct smbcli_state *cli_nt = NULL, *cli_dos = NULL; bool result = false; int fnum; const char *os2_fname = ".+,;=[]."; const char *dname = "samba3_errordir"; union smb_open io; TALLOC_CTX *mem_ctx = talloc_init("samba3_errorpaths"); NTSTATUS status; if (mem_ctx == NULL) { torture_comment(tctx, "talloc_init failed\n"); return false; } nt_status_support = lp_nt_status_support(tctx->lp_ctx); if (!lp_set_cmdline(tctx->lp_ctx, "nt status support", "yes")) { torture_comment(tctx, "Could not set 'nt status support = yes'\n"); goto fail; } if (!torture_open_connection(&cli_nt, tctx, 0)) { goto fail; } if (!lp_set_cmdline(tctx->lp_ctx, "nt status support", "no")) { torture_comment(tctx, "Could not set 'nt status support = yes'\n"); goto fail; } if (!torture_open_connection(&cli_dos, tctx, 1)) { goto fail; } if (!lp_set_cmdline(tctx->lp_ctx, "nt status support", nt_status_support ? "yes":"no")) { torture_comment(tctx, "Could not reset 'nt status support = yes'"); goto fail; } smbcli_unlink(cli_nt->tree, os2_fname); smbcli_rmdir(cli_nt->tree, dname); if (!NT_STATUS_IS_OK(smbcli_mkdir(cli_nt->tree, dname))) { torture_comment(tctx, "smbcli_mkdir(%s) failed: %s\n", dname, smbcli_errstr(cli_nt->tree)); goto fail; } io.generic.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 1024*1024; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = 0; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; io.ntcreatex.in.security_flags = 0; io.ntcreatex.in.fname = dname; status = smb_raw_open(cli_nt->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_OBJECT_NAME_COLLISION)); goto fail; } status = smb_raw_open(cli_dos->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRfilexists))) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_DOS(ERRDOS, ERRfilexists))); goto fail; } status = smbcli_mkdir(cli_nt->tree, dname); if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_OBJECT_NAME_COLLISION)); goto fail; } status = smbcli_mkdir(cli_dos->tree, dname); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRnoaccess))) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_DOS(ERRDOS, ERRnoaccess))); goto fail; } { union smb_mkdir md; md.t2mkdir.level = RAW_MKDIR_T2MKDIR; md.t2mkdir.in.path = dname; md.t2mkdir.in.num_eas = 0; md.t2mkdir.in.eas = NULL; status = smb_raw_mkdir(cli_nt->tree, &md); if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { torture_comment( tctx, "(%s) incorrect status %s should be " "NT_STATUS_OBJECT_NAME_COLLISION\n", __location__, nt_errstr(status)); goto fail; } status = smb_raw_mkdir(cli_dos->tree, &md); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRrename))) { torture_comment(tctx, "(%s) incorrect status %s " "should be ERRDOS:ERRrename\n", __location__, nt_errstr(status)); goto fail; } } io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; status = smb_raw_open(cli_nt->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_OBJECT_NAME_COLLISION)); goto fail; } status = smb_raw_open(cli_dos->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRfilexists))) { torture_comment(tctx, "(%s) incorrect status %s should be %s\n", __location__, nt_errstr(status), nt_errstr(NT_STATUS_DOS(ERRDOS, ERRfilexists))); goto fail; } { /* Test an invalid DOS deny mode */ const char *fname = "test.txt"; fnum = smbcli_open(cli_nt->tree, fname, O_RDWR | O_CREAT, 5); if (fnum != -1) { torture_comment(tctx, "Open(%s) with invalid deny mode succeeded -- " "expected failure\n", fname); smbcli_close(cli_nt->tree, fnum); goto fail; } if (!NT_STATUS_EQUAL(smbcli_nt_error(cli_nt->tree), NT_STATUS_DOS(ERRDOS,ERRbadaccess))) { torture_comment(tctx, "Expected DOS error ERRDOS/ERRbadaccess, " "got %s\n", smbcli_errstr(cli_nt->tree)); goto fail; } fnum = smbcli_open(cli_dos->tree, fname, O_RDWR | O_CREAT, 5); if (fnum != -1) { torture_comment(tctx, "Open(%s) with invalid deny mode succeeded -- " "expected failure\n", fname); smbcli_close(cli_nt->tree, fnum); goto fail; } if (!NT_STATUS_EQUAL(smbcli_nt_error(cli_nt->tree), NT_STATUS_DOS(ERRDOS,ERRbadaccess))) { torture_comment(tctx, "Expected DOS error ERRDOS:ERRbadaccess, " "got %s\n", smbcli_errstr(cli_nt->tree)); goto fail; } } { /* * Samba 3.0.23 has a bug that an existing file can be opened * as a directory using ntcreate&x. Test this. */ const char *fname = "\\test_dir.txt"; fnum = smbcli_open(cli_nt->tree, fname, O_RDWR|O_CREAT, DENY_NONE); if (fnum == -1) { d_printf("(%s) smbcli_open failed: %s\n", __location__, smbcli_errstr(cli_nt->tree)); } smbcli_close(cli_nt->tree, fnum); io.generic.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 0; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ| NTCREATEX_SHARE_ACCESS_WRITE| NTCREATEX_SHARE_ACCESS_DELETE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; io.ntcreatex.in.security_flags = 0; io.ntcreatex.in.fname = fname; io.ntcreatex.in.flags = 0; status = smb_raw_open(cli_nt->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_A_DIRECTORY)) { torture_comment(tctx, "ntcreate as dir gave %s, " "expected NT_STATUS_NOT_A_DIRECTORY\n", nt_errstr(status)); result = false; } if (NT_STATUS_IS_OK(status)) { smbcli_close(cli_nt->tree, io.ntcreatex.out.file.fnum); } status = smb_raw_open(cli_dos->tree, mem_ctx, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOS(ERRDOS, ERRbaddirectory))) { torture_comment(tctx, "ntcreate as dir gave %s, " "expected NT_STATUS_NOT_A_DIRECTORY\n", nt_errstr(status)); result = false; } if (NT_STATUS_IS_OK(status)) { smbcli_close(cli_dos->tree, io.ntcreatex.out.file.fnum); } smbcli_unlink(cli_nt->tree, fname); } if (!torture_setting_bool(tctx, "samba3", false)) { goto done; } fnum = smbcli_open(cli_dos->tree, os2_fname, O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); if (fnum != -1) { torture_comment(tctx, "Open(%s) succeeded -- expected failure\n", os2_fname); smbcli_close(cli_dos->tree, fnum); goto fail; } if (!NT_STATUS_EQUAL(smbcli_nt_error(cli_dos->tree), NT_STATUS_DOS(ERRDOS, ERRcannotopen))) { torture_comment(tctx, "Expected DOS error ERRDOS/ERRcannotopen, got %s\n", smbcli_errstr(cli_dos->tree)); goto fail; } fnum = smbcli_open(cli_nt->tree, os2_fname, O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); if (fnum != -1) { torture_comment(tctx, "Open(%s) succeeded -- expected failure\n", os2_fname); smbcli_close(cli_nt->tree, fnum); goto fail; } if (!NT_STATUS_EQUAL(smbcli_nt_error(cli_nt->tree), NT_STATUS_OBJECT_NAME_NOT_FOUND)) { torture_comment(tctx, "Expected error NT_STATUS_OBJECT_NAME_NOT_FOUND, " "got %s\n", smbcli_errstr(cli_nt->tree)); goto fail; } done: result = true; fail: if (cli_dos != NULL) { torture_close_connection(cli_dos); } if (cli_nt != NULL) { torture_close_connection(cli_nt); } return result;}NTSTATUS torture_base_init(void){ struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "BASE"); torture_suite_add_2smb_test(suite, "FDPASS", run_fdpasstest); torture_suite_add_suite(suite, torture_base_locktest(suite)); torture_suite_add_1smb_test(suite, "UNLINK", torture_unlinktest); torture_suite_add_1smb_test(suite, "ATTR", run_attrtest); torture_suite_add_1smb_test(suite, "TRANS2", run_trans2test); torture_suite_add_simple_test(suite, "NEGNOWAIT", run_negprot_nowait); torture_suite_add_1smb_test(suite, "DIR1", torture_dirtest1); torture_suite_add_1smb_test(suite, "DIR2", torture_dirtest2); torture_suite_add_1smb_test(suite, "DENY1", torture_denytest1); torture_suite_add_2smb_test(suite, "DENY2", torture_denytest2); torture_suite_add_2smb_test(suite, "DENY3", torture_denytest3); torture_suite_add_1smb_test(suite, "DENYDOS", torture_denydos_sharing); torture_suite_add_smb_multi_test(suite, "NTDENY1", torture_ntdenytest1); torture_suite_add_2smb_test(suite, "NTDENY2", torture_ntdenytest2); torture_suite_add_1smb_test(suite, "TCON", run_tcon_test); torture_suite_add_1smb_test(suite, "TCONDEV", run_tcon_devtype_test); torture_suite_add_1smb_test(suite, "VUID", run_vuidtest); torture_suite_add_2smb_test(suite, "RW1", run_readwritetest); torture_suite_add_2smb_test(suite, "OPEN", run_opentest); torture_suite_add_smb_multi_test(suite, "DEFER_OPEN", run_deferopen); torture_suite_add_1smb_test(suite, "XCOPY", run_xcopy); torture_suite_add_1smb_test(suite, "IOMETER", run_iometer); torture_suite_add_1smb_test(suite, "RENAME", torture_test_rename); torture_suite_add_suite(suite, torture_test_delete()); torture_suite_add_1smb_test(suite, "PROPERTIES", torture_test_properties); torture_suite_add_1smb_test(suite, "MANGLE", torture_mangle); torture_suite_add_1smb_test(suite, "OPENATTR", torture_openattrtest); torture_suite_add_suite(suite, torture_charset(suite)); torture_suite_add_1smb_test(suite, "CHKPATH", torture_chkpath_test); torture_suite_add_1smb_test(suite, "SECLEAK", torture_sec_leak); torture_suite_add_simple_test(suite, "DISCONNECT", torture_disconnect); torture_suite_add_suite(suite, torture_delay_write()); torture_suite_add_simple_test(suite, "SAMBA3ERROR", torture_samba3_errorpaths); torture_suite_add_1smb_test(suite, "CASETABLE", torture_casetable); torture_suite_add_1smb_test(suite, "UTABLE", torture_utable); torture_suite_add_simple_test(suite, "SMB", torture_smb_scan); torture_suite_add_suite(suite, torture_trans2_aliases(suite)); torture_suite_add_1smb_test(suite, "TRANS2-SCAN", torture_trans2_scan); torture_suite_add_1smb_test(suite, "NTTRANS", torture_nttrans_scan); torture_suite_add_simple_test(suite, "BENCH-HOLDCON", torture_holdcon); torture_suite_add_simple_test(suite, "BENCH-READWRITE", run_benchrw); torture_suite_add_smb_multi_test(suite, "BENCH-TORTURE", run_torture); torture_suite_add_1smb_test(suite, "SCAN-PIPE_NUMBER", run_pipe_number); torture_suite_add_1smb_test(suite, "SCAN-IOCTL", torture_ioctl_test); torture_suite_add_smb_multi_test(suite, "SCAN-MAXFID", run_maxfidtest); suite->description = talloc_strdup(suite, "Basic SMB tests (imported from the original smbtorture)"); torture_register_suite(suite); return NT_STATUS_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -