diff options
Diffstat (limited to 'source4/torture')
-rw-r--r-- | source4/torture/raw/samba3misc.c | 212 |
1 files changed, 210 insertions, 2 deletions
diff --git a/source4/torture/raw/samba3misc.c b/source4/torture/raw/samba3misc.c index eea6fe2bc6..66462ca5b1 100644 --- a/source4/torture/raw/samba3misc.c +++ b/source4/torture/raw/samba3misc.c @@ -25,6 +25,7 @@ #include "system/filesys.h" #include "libcli/libcli.h" #include "torture/util.h" +#include "torture/raw/proto.h" #define CHECK_STATUS(status, correct) do { \ if (!NT_STATUS_EQUAL(status, correct)) { \ @@ -219,10 +220,12 @@ static NTSTATUS raw_smbcli_open(struct smbcli_tree *tree, const char *fname, int BOOL torture_samba3_badpath(struct torture_context *torture) { - struct smbcli_state *cli_nt; - struct smbcli_state *cli_dos; + struct smbcli_state *cli_nt = NULL; + struct smbcli_state *cli_dos = NULL; const char *fname = "test.txt"; const char *dirname = "testdir"; + const char *invname = "testdir\\notthere.txt"; + const char *invpath = "test.txt\\test.txt"; char *fpath; int fnum; NTSTATUS status; @@ -263,6 +266,7 @@ BOOL torture_samba3_badpath(struct torture_context *torture) goto fail; } + smbcli_unlink(cli_nt->tree, fname); smbcli_deltree(cli_nt->tree, dirname); status = smbcli_mkdir(cli_nt->tree, dirname); @@ -303,6 +307,14 @@ BOOL torture_samba3_badpath(struct torture_context *torture) } smbcli_close(cli_nt->tree, fnum); + fnum = smbcli_open(cli_nt->tree, fname, O_RDWR | O_CREAT, DENY_NONE); + if (fnum == -1) { + d_printf("Could not create file %s: %s\n", fname, + smbcli_errstr(cli_nt->tree)); + goto fail; + } + smbcli_close(cli_nt->tree, fnum); + /* * Do a whole bunch of error code checks on chkpath */ @@ -452,6 +464,201 @@ BOOL torture_samba3_badpath(struct torture_context *torture) status = raw_smbcli_open(cli_dos->tree, "<\\bla", O_RDONLY, DENY_NONE, NULL); CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname)); + /* + * Walk the Samba3 unix_convert bad_path handling. Some interesting + * error paths around... + */ + + status = smbcli_chkpath(cli_nt->tree, invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_chkpath(cli_dos->tree, invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_getatr(cli_nt->tree, invpath, NULL, NULL, NULL); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_getatr(cli_dos->tree, invpath, NULL, NULL, NULL); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_setatr(cli_nt->tree, invpath, 0, 0); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_setatr(cli_dos->tree, invpath, 0, 0); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_setatr(cli_nt->tree, invpath, FILE_ATTRIBUTE_NORMAL, + 0); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_setatr(cli_dos->tree, invpath, FILE_ATTRIBUTE_NORMAL, + 0); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_setatr(cli_nt->tree, invname, 0, 0); + CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND); + status = smbcli_setatr(cli_dos->tree, invname, 0, 0); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadfile)); + + /* + * reply_search returns STATUS_NO_MORE_FILES on invalid path + */ + + goto done; /* We're not yet fully there, but keep it + * in */ + + status = torture_single_search(cli_nt, mem_ctx, invpath, + RAW_SEARCH_SEARCH, + RAW_SEARCH_DATA_SEARCH, 0, NULL); + CHECK_STATUS(status, STATUS_NO_MORE_FILES); + status = torture_single_search(cli_dos, mem_ctx, invpath, + RAW_SEARCH_SEARCH, + RAW_SEARCH_DATA_SEARCH, 0, NULL); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRnofiles)); + + /* + * ... whereas t2search gets you NT_STATUS_INVALID_PARAMETER + */ + + status = torture_single_search(cli_nt, mem_ctx, dirname, + RAW_SEARCH_TRANS2, + RAW_SEARCH_DATA_STANDARD, 0xf, NULL); + CHECK_STATUS(status, STATUS_NO_MORE_FILES); + status = torture_single_search(cli_dos, mem_ctx, dirname, + RAW_SEARCH_TRANS2, + RAW_SEARCH_DATA_STANDARD, 0xf, NULL); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRnofiles)); + + status = torture_single_search(cli_nt, mem_ctx, invpath, + RAW_SEARCH_TRANS2, + RAW_SEARCH_DATA_STANDARD, 0xf, NULL); + CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER); + status = torture_single_search(cli_dos, mem_ctx, invpath, + RAW_SEARCH_TRANS2, + RAW_SEARCH_DATA_STANDARD, 0xf, NULL); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidparam)); + + { + union smb_open o; + o.openold.level = RAW_OPEN_OPEN; + o.openold.in.open_mode = 0; + o.openold.in.search_attrs = 0; + o.openold.in.fname = invpath; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + ZERO_STRUCT(o); + o.openx.level = RAW_OPEN_OPENX; + o.openx.in.fname = invpath; + o.openx.in.open_func = OPENX_OPEN_FUNC_OPEN; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + ZERO_STRUCT(o); + o.mknew.level = RAW_OPEN_MKNEW; + o.mknew.in.fname = invpath; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + ZERO_STRUCT(o); + o.ntcreatex.level = RAW_OPEN_NTCREATEX; + o.ntcreatex.in.fname = invpath; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + ZERO_STRUCT(o); + o.nttrans.level = RAW_OPEN_NTTRANS_CREATE; + o.nttrans.in.fname = invpath; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + /* + * TODO: Check t2open + */ + +#if 0 + /* + * This call seems completely broken on W2k3. It gives back a + * fid, and when you later want to close it the server returns + * INVALID_HANDLE.... + */ + + /* + * W2k3 puts the ctemp files into the root of the share, it + * seems to ignore the directory given. And, the file name + * given back seems to be bogus. The real file name is + * prepended with a "t"... + */ + + ZERO_STRUCT(o); + o.ctemp.level = RAW_OPEN_CTEMP; + o.ctemp.in.directory = invpath; + + status = smb_raw_open(cli_nt->tree, mem_ctx, &o); + if (NT_STATUS_IS_OK(status)) { + smbcli_nt_delete_on_close( + cli_nt->tree, o.ctemp.out.file.fnum, True); + smbcli_close(cli_nt->tree, o.ctemp.out.file.fnum); + } + CHECK_STATUS(status, NT_STATUS_OK); + status = smb_raw_open(cli_dos->tree, mem_ctx, &o); + if (NT_STATUS_IS_OK(status)) { + smbcli_nt_delete_on_close( + cli_nt->tree, o.ctemp.out.file.fnum, True); + smbcli_close(cli_nt->tree, o.ctemp.out.file.fnum); + } + CHECK_STATUS(status, NT_STATUS_OK); +#endif + } + + status = smbcli_unlink(cli_nt->tree, invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_unlink(cli_dos->tree, invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_mkdir(cli_nt->tree, invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_mkdir(cli_dos->tree, invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_rmdir(cli_nt->tree, invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_rmdir(cli_dos->tree, invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_rename(cli_nt->tree, invpath, ""); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD); + status = smbcli_rename(cli_dos->tree, invpath, ""); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath)); + + status = smbcli_rename(cli_nt->tree, "", invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD); + status = smbcli_rename(cli_dos->tree, "", invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath)); + + status = smbcli_rename(cli_nt->tree, invpath, invpath); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_rename(cli_dos->tree, invpath, invpath); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + + status = smbcli_qpathinfo(cli_nt->tree, invpath, NULL, NULL, NULL, + NULL, NULL); + CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND); + status = smbcli_qpathinfo(cli_dos->tree, invpath, NULL, NULL, NULL, + NULL, NULL); + CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath)); + goto done; fail: @@ -460,6 +667,7 @@ BOOL torture_samba3_badpath(struct torture_context *torture) done: if (cli_nt != NULL) { smbcli_deltree(cli_nt->tree, dirname); + smbcli_unlink(cli_nt->tree, fname); torture_close_connection(cli_nt); } if (cli_dos != NULL) { |