2 Unix SMB/CIFS implementation.
3 chkpath individual test suite
4 Copyright (C) Andrew Tridgell 2003
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "torture/torture.h"
23 #include "libcli/raw/libcliraw.h"
24 #include "libcli/libcli.h"
26 #define BASEDIR "\\rawchkpath"
28 #define CHECK_STATUS(status, correct, dos_correct) do { \
29 if (!NT_STATUS_EQUAL(status, correct) && !NT_STATUS_EQUAL(status, dos_correct)) { \
30 printf("(%d) Incorrect status %s - should be %s\n", \
31 __LINE__, nt_errstr(status), nt_errstr(correct)); \
37 static NTSTATUS
single_search(struct smbcli_state
*cli
,
38 TALLOC_CTX
*mem_ctx
, const char *pattern
)
40 union smb_search_first io
;
43 io
.generic
.level
= RAW_SEARCH_STANDARD
;
44 io
.t2ffirst
.in
.search_attrib
= 0;
45 io
.t2ffirst
.in
.max_count
= 1;
46 io
.t2ffirst
.in
.flags
= FLAG_TRANS2_FIND_CLOSE
;
47 io
.t2ffirst
.in
.storage_type
= 0;
48 io
.t2ffirst
.in
.pattern
= pattern
;
50 status
= smb_raw_search_first(cli
->tree
, mem_ctx
,
56 static BOOL
test_path(struct smbcli_state
*cli
, const char *path
, NTSTATUS expected
, NTSTATUS dos_expected
)
58 struct smb_chkpath io
;
61 status
= smb_raw_chkpath(cli
->tree
, &io
);
62 if (!NT_STATUS_EQUAL(status
, expected
) && !NT_STATUS_EQUAL(status
, dos_expected
)) {
63 printf("%-40s FAILED %s should be %s or %s\n",
64 path
, nt_errstr(status
), nt_errstr(expected
), nt_errstr(dos_expected
));
67 printf("%-40s correct (%s)\n", path
, nt_errstr(status
));
73 static BOOL
test_chkpath(struct smbcli_state
*cli
, TALLOC_CTX
*mem_ctx
)
75 struct smb_chkpath io
;
83 status
= smb_raw_chkpath(cli
->tree
, &io
);
84 CHECK_STATUS(status
, NT_STATUS_OK
, NT_STATUS_OK
);
86 ret
&= test_path(cli
, BASEDIR
"\\nodir", NT_STATUS_OBJECT_NAME_NOT_FOUND
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
88 fnum
= create_complex_file(cli
, mem_ctx
, BASEDIR
"\\test.txt..");
90 printf("failed to open test.txt - %s\n", smbcli_errstr(cli
->tree
));
95 ret
&= test_path(cli
, BASEDIR
"\\test.txt..", NT_STATUS_NOT_A_DIRECTORY
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
97 if (!torture_set_file_attribute(cli
->tree
, BASEDIR
, FILE_ATTRIBUTE_HIDDEN
)) {
98 printf("failed to set basedir hidden\n");
103 ret
&= test_path(cli
, BASEDIR
, NT_STATUS_OK
, NT_STATUS_OK
);
104 ret
&= test_path(cli
, BASEDIR
"\\foo\\..\\test.txt..", NT_STATUS_NOT_A_DIRECTORY
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
105 ret
&= test_path(cli
, "", NT_STATUS_OK
, NT_STATUS_OK
);
106 ret
&= test_path(cli
, ".", NT_STATUS_OBJECT_NAME_INVALID
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
107 ret
&= test_path(cli
, ".\\", NT_STATUS_OBJECT_NAME_INVALID
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
108 ret
&= test_path(cli
, "\\\\\\.\\", NT_STATUS_OBJECT_NAME_INVALID
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
109 ret
&= test_path(cli
, ".\\.", NT_STATUS_OBJECT_PATH_NOT_FOUND
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
110 ret
&= test_path(cli
, "." BASEDIR
, NT_STATUS_OBJECT_PATH_NOT_FOUND
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
111 ret
&= test_path(cli
, BASEDIR
"\\.", NT_STATUS_OBJECT_NAME_INVALID
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
112 ret
&= test_path(cli
, BASEDIR
"\\.\\test.txt..", NT_STATUS_OBJECT_PATH_NOT_FOUND
, NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
113 ret
&= test_path(cli
, ".\\.\\", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
114 ret
&= test_path(cli
, ".\\.\\.", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
115 ret
&= test_path(cli
, ".\\.\\.aaaaa", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
116 ret
&= test_path(cli
, "\\.\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
117 ret
&= test_path(cli
, "\\.\\\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
118 ret
&= test_path(cli
, "\\.\\\\\\\\\\\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
120 /* Note that the two following paths are identical but
121 give different NT status returns for chkpth and findfirst. */
123 printf("testing findfirst on %s\n", "\\.\\\\\\\\\\\\.");
124 status
= single_search(cli
, mem_ctx
, "\\.\\\\\\\\\\\\.");
125 CHECK_STATUS(status
, NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRinvalidname
));
127 ret
&= test_path(cli
, "\\.\\\\\\\\\\\\.", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
129 /* We expect this open to fail with the same error code as the chkpath below. */
130 printf("testing Open on %s\n", "\\.\\\\\\\\\\\\.");
131 /* findfirst seems to fail with a different error. */
132 fnum1
= smbcli_nt_create_full(cli
->tree
, "\\.\\\\\\\\\\\\.",
133 0, SEC_RIGHTS_FILE_ALL
,
134 FILE_ATTRIBUTE_NORMAL
,
135 NTCREATEX_SHARE_ACCESS_DELETE
|
136 NTCREATEX_SHARE_ACCESS_READ
|
137 NTCREATEX_SHARE_ACCESS_WRITE
,
138 NTCREATEX_DISP_OVERWRITE_IF
,
140 status
= smbcli_nt_error(cli
->tree
);
141 CHECK_STATUS(status
, NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
144 ret
&= test_path(cli
, "\\.\\\\xxx", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
145 ret
&= test_path(cli
, "..\\..\\..", NT_STATUS_OBJECT_PATH_SYNTAX_BAD
,NT_STATUS_DOS(ERRDOS
,ERRinvalidpath
));
146 ret
&= test_path(cli
, "\\..", NT_STATUS_OBJECT_PATH_SYNTAX_BAD
,NT_STATUS_DOS(ERRDOS
,ERRinvalidpath
));
147 ret
&= test_path(cli
, "\\.\\\\\\\\\\\\xxx", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
148 ret
&= test_path(cli
, BASEDIR
"\\.\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
149 ret
&= test_path(cli
, BASEDIR
"\\.\\\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
150 ret
&= test_path(cli
, BASEDIR
"\\.\\nt", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
151 ret
&= test_path(cli
, BASEDIR
"\\.\\.\\nt", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
152 ret
&= test_path(cli
, BASEDIR
"\\nt", NT_STATUS_OK
, NT_STATUS_OK
);
153 ret
&= test_path(cli
, BASEDIR
".\\foo", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
154 ret
&= test_path(cli
, BASEDIR
"xx\\foo", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
155 ret
&= test_path(cli
, ".\\", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
156 ret
&= test_path(cli
, ".\\.", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
157 ret
&= test_path(cli
, ".\\.\\.\\.\\foo\\.\\.\\", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
158 ret
&= test_path(cli
, BASEDIR
".\\.\\.\\.\\foo\\.\\.\\", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
159 ret
&= test_path(cli
, BASEDIR
".\\.\\.\\.\\foo\\..\\.\\", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
160 ret
&= test_path(cli
, BASEDIR
".", NT_STATUS_OBJECT_NAME_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
161 ret
&= test_path(cli
, "\\", NT_STATUS_OK
,NT_STATUS_OK
);
162 ret
&= test_path(cli
, "\\.", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
163 ret
&= test_path(cli
, "\\..\\", NT_STATUS_OBJECT_PATH_SYNTAX_BAD
,NT_STATUS_DOS(ERRDOS
,ERRinvalidpath
));
164 ret
&= test_path(cli
, "\\..", NT_STATUS_OBJECT_PATH_SYNTAX_BAD
,NT_STATUS_DOS(ERRDOS
,ERRinvalidpath
));
165 ret
&= test_path(cli
, BASEDIR
"\\.", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
166 ret
&= test_path(cli
, BASEDIR
"\\..", NT_STATUS_OK
,NT_STATUS_OK
);
167 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\VB98\\vb600", NT_STATUS_OBJECT_NAME_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
168 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\VB98\\vb6.exe", NT_STATUS_NOT_A_DIRECTORY
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
170 /* We expect this open to fail with the same error code as the chkpath below. */
171 printf("testing Open on %s\n", BASEDIR
".\\.\\.\\.\\foo\\..\\.\\");
172 /* findfirst seems to fail with a different error. */
173 fnum1
= smbcli_nt_create_full(cli
->tree
, BASEDIR
".\\.\\.\\.\\foo\\..\\.\\",
174 0, SEC_RIGHTS_FILE_ALL
,
175 FILE_ATTRIBUTE_NORMAL
,
176 NTCREATEX_SHARE_ACCESS_DELETE
|
177 NTCREATEX_SHARE_ACCESS_READ
|
178 NTCREATEX_SHARE_ACCESS_WRITE
,
179 NTCREATEX_DISP_OVERWRITE_IF
,
181 status
= smbcli_nt_error(cli
->tree
);
182 CHECK_STATUS(status
, NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
184 printf("testing findfirst on %s\n", BASEDIR
".\\.\\.\\.\\foo\\..\\.\\");
185 status
= single_search(cli
, mem_ctx
, BASEDIR
".\\.\\.\\.\\foo\\..\\.\\");
186 CHECK_STATUS(status
, NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
188 /* We expect this open to fail with the same error code as the chkpath below. */
189 /* findfirst seems to fail with a different error. */
190 printf("testing Open on %s\n", BASEDIR
"\\nt\\V S\\VB98\\vb6.exe\\3");
191 fnum1
= smbcli_nt_create_full(cli
->tree
, BASEDIR
"\\nt\\V S\\VB98\\vb6.exe\\3",
192 0, SEC_RIGHTS_FILE_ALL
,
193 FILE_ATTRIBUTE_NORMAL
,
194 NTCREATEX_SHARE_ACCESS_DELETE
|
195 NTCREATEX_SHARE_ACCESS_READ
|
196 NTCREATEX_SHARE_ACCESS_WRITE
,
197 NTCREATEX_DISP_OVERWRITE_IF
,
199 status
= smbcli_nt_error(cli
->tree
);
200 CHECK_STATUS(status
, NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
202 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\VB98\\vb6.exe\\3", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
203 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\VB98\\vb6.exe\\3\\foo", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
204 ret
&= test_path(cli
, BASEDIR
"\\nt\\3\\foo", NT_STATUS_OBJECT_PATH_NOT_FOUND
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
205 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\*\\vb6.exe\\3", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
206 ret
&= test_path(cli
, BASEDIR
"\\nt\\V S\\*\\*\\vb6.exe\\3", NT_STATUS_OBJECT_NAME_INVALID
,NT_STATUS_DOS(ERRDOS
,ERRbadpath
));
209 smbcli_close(cli
->tree
, fnum
);
214 basic testing of chkpath calls
216 BOOL
torture_raw_chkpath(void)
218 struct smbcli_state
*cli
;
223 if (!torture_open_connection(&cli
)) {
227 mem_ctx
= talloc_init("torture_raw_chkpath");
229 if (!torture_setup_dir(cli
, BASEDIR
)) {
233 if (NT_STATUS_IS_ERR(smbcli_mkdir(cli
->tree
, BASEDIR
"\\nt"))) {
234 printf("Failed to create " BASEDIR
" - %s\n", smbcli_errstr(cli
->tree
));
238 if (NT_STATUS_IS_ERR(smbcli_mkdir(cli
->tree
, BASEDIR
"\\nt\\V S"))) {
239 printf("Failed to create " BASEDIR
" - %s\n", smbcli_errstr(cli
->tree
));
243 if (NT_STATUS_IS_ERR(smbcli_mkdir(cli
->tree
, BASEDIR
"\\nt\\V S\\VB98"))) {
244 printf("Failed to create " BASEDIR
" - %s\n", smbcli_errstr(cli
->tree
));
248 fnum
= create_complex_file(cli
, mem_ctx
, BASEDIR
"\\nt\\V S\\VB98\\vb6.exe");
250 printf("failed to open \\nt\\V S\\VB98\\vb6.exe - %s\n", smbcli_errstr(cli
->tree
));
255 if (!test_chkpath(cli
, mem_ctx
)) {
261 smb_raw_exit(cli
->session
);
262 smbcli_deltree(cli
->tree
, BASEDIR
);
264 torture_close_connection(cli
);
265 talloc_free(mem_ctx
);