summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-09-03 20:06:27 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:58:32 -0500
commitf0ae80e18ceb937c2053f2c8cf56c62ab24fc54e (patch)
tree928aa1c229496c58df77e4cd9db8020011c59ccb
parentcecc2b38f1d3ed2c29487bd4fcfd38487095661d (diff)
downloadsamba-f0ae80e18ceb937c2053f2c8cf56c62ab24fc54e.tar.gz
samba-f0ae80e18ceb937c2053f2c8cf56c62ab24fc54e.tar.bz2
samba-f0ae80e18ceb937c2053f2c8cf56c62ab24fc54e.zip
r2217: Ad-hoc tests to allow me to work out the correct error code
for the bad path algorithm. Jeremy. (This used to be commit d2d32d8f2b7a4a3e62f505adae787b42f80309bb)
-rw-r--r--source4/torture/raw/chkpath.c130
1 files changed, 128 insertions, 2 deletions
diff --git a/source4/torture/raw/chkpath.c b/source4/torture/raw/chkpath.c
index f5e86c8048..72ea1a8d75 100644
--- a/source4/torture/raw/chkpath.c
+++ b/source4/torture/raw/chkpath.c
@@ -31,6 +31,25 @@
}} while (0)
+static NTSTATUS single_search(struct smbcli_state *cli,
+ TALLOC_CTX *mem_ctx, const char *pattern)
+{
+ union smb_search_first io;
+ NTSTATUS status;
+
+ io.generic.level = RAW_SEARCH_STANDARD;
+ io.t2ffirst.in.search_attrib = 0;
+ io.t2ffirst.in.max_count = 1;
+ io.t2ffirst.in.flags = FLAG_TRANS2_FIND_CLOSE;
+ io.t2ffirst.in.storage_type = 0;
+ io.t2ffirst.in.pattern = pattern;
+
+ status = smb_raw_search_first(cli->tree, mem_ctx,
+ &io, NULL, NULL);
+
+ return status;
+}
+
static BOOL test_chkpath(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
{
struct smb_chkpath io;
@@ -48,14 +67,14 @@ static BOOL test_chkpath(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
status = smb_raw_chkpath(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
- fnum = create_complex_file(cli, mem_ctx, BASEDIR "\\test.txt");
+ fnum = create_complex_file(cli, mem_ctx, BASEDIR "\\test.txt..");
if (fnum == -1) {
printf("failed to open test.txt - %s\n", smbcli_errstr(cli->tree));
ret = False;
goto done;
}
- io.in.path = BASEDIR "\\test.txt";
+ io.in.path = BASEDIR "\\test.txt..";
printf("testing %s\n", io.in.path);
status = smb_raw_chkpath(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_NOT_A_DIRECTORY);
@@ -81,11 +100,93 @@ static BOOL test_chkpath(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
status = smb_raw_chkpath(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+ io.in.path = ".\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
+ io.in.path = ".\\.";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ io.in.path = ".\\.\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ io.in.path = ".\\.\\.";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ io.in.path = ".\\.\\.aaaaa";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ io.in.path = "\\.\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
+ io.in.path = "\\.\\\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
+ io.in.path = "\\.\\\\\\\\\\\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
+ /* Note that the two following paths are identical but
+ give different NT status returns for chkpth and findfirst. */
+
+ printf("testing findfirst on %s\n", "\\.\\\\\\\\\\\\.");
+ status = single_search(cli, mem_ctx, "\\.\\\\\\\\\\\\.");
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
+ io.in.path = "\\.\\\\\\\\\\\\.";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ /* We expect this open to fail with the same error code as the chkpath below. */
+ printf("testing Open on %s\n", "\\.\\\\\\\\\\\\.");
+ /* findfirst seems to fail with a different error. */
+ fnum1 = smbcli_nt_create_full(cli->tree, "\\.\\\\\\\\\\\\.",
+ 0, GENERIC_RIGHTS_FILE_ALL_ACCESS,
+ FILE_ATTRIBUTE_NORMAL,
+ NTCREATEX_SHARE_ACCESS_DELETE|
+ NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE,
+ NTCREATEX_DISP_OVERWRITE_IF,
+ 0, 0);
+ status = smbcli_nt_error(cli->tree);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+
+ io.in.path = "\\.\\\\xxx";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ io.in.path = "\\.\\\\\\\\\\\\xxx";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
io.in.path = BASEDIR"\\.\\";
printf("testing %s\n", io.in.path);
status = smb_raw_chkpath(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+ io.in.path = BASEDIR"\\.\\\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+
io.in.path = BASEDIR"\\.\\nt";
printf("testing %s\n", io.in.path);
status = smb_raw_chkpath(cli->tree, &io);
@@ -146,6 +247,11 @@ static BOOL test_chkpath(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
status = smb_raw_chkpath(cli->tree, &io);
CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
+ io.in.path = "\\..\\";
+ printf("testing %s\n", io.in.path);
+ status = smb_raw_chkpath(cli->tree, &io);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
+
io.in.path = "\\..";
printf("testing %s\n", io.in.path);
status = smb_raw_chkpath(cli->tree, &io);
@@ -172,6 +278,26 @@ static BOOL test_chkpath(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
CHECK_STATUS(status, NT_STATUS_NOT_A_DIRECTORY);
/* We expect this open to fail with the same error code as the chkpath below. */
+ printf("testing Open on %s\n", BASEDIR".\\.\\.\\.\\foo\\..\\.\\");
+ /* findfirst seems to fail with a different error. */
+ fnum1 = smbcli_nt_create_full(cli->tree, BASEDIR".\\.\\.\\.\\foo\\..\\.\\",
+ 0, GENERIC_RIGHTS_FILE_ALL_ACCESS,
+ FILE_ATTRIBUTE_NORMAL,
+ NTCREATEX_SHARE_ACCESS_DELETE|
+ NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE,
+ NTCREATEX_DISP_OVERWRITE_IF,
+ 0, 0);
+ status = smbcli_nt_error(cli->tree);
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ printf("testing findfirst on %s\n", BASEDIR".\\.\\.\\.\\foo\\..\\.\\");
+ status = single_search(cli, mem_ctx, BASEDIR".\\.\\.\\.\\foo\\..\\.\\");
+ CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
+
+ /* We expect this open to fail with the same error code as the chkpath below. */
+ /* findfirst seems to fail with a different error. */
+ printf("testing Open on %s\n", BASEDIR "\\nt\\Visual Studio\\VB98\\vb6.exe\\3");
fnum1 = smbcli_nt_create_full(cli->tree, BASEDIR "\\nt\\Visual Studio\\VB98\\vb6.exe\\3",
0, GENERIC_RIGHTS_FILE_ALL_ACCESS,
FILE_ATTRIBUTE_NORMAL,