1 /***************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at http://curl.haxx.se/docs/copyright.html.
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ***************************************************************************/
22 #include "curlcheck.h"
24 #include "tool_cfgable.h"
25 #include "tool_doswin.h"
31 #include "memdebug.h" /* LAST include file */
33 static CURLcode unit_setup(void)
38 static void unit_stop(void)
43 #if defined(MSDOS) || defined(WIN32)
45 static char *getflagstr(int flags)
47 char *buf = malloc(256);
48 fail_unless(buf, "out of memory");
49 snprintf(buf, 256, "%s,%s,%s,%s",
50 ((flags & SANITIZE_ALLOW_COLONS) ? "SANITIZE_ALLOW_COLONS" : ""),
51 ((flags & SANITIZE_ALLOW_PATH) ? "SANITIZE_ALLOW_PATH" : ""),
52 ((flags & SANITIZE_ALLOW_RESERVED) ? "SANITIZE_ALLOW_RESERVED" : ""),
53 ((flags & SANITIZE_ALLOW_TRUNCATE) ? "SANITIZE_ALLOW_TRUNCATE" : ""));
57 static char *getcurlcodestr(int cc)
59 char *buf = malloc(256);
60 fail_unless(buf, "out of memory");
61 snprintf(buf, 256, "%s (%d)",
62 (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
63 cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
64 cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
65 cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY" :
66 "unexpected error code - add name"),
74 const char *expected_output;
75 CURLcode expected_result;
80 { /* START sanitize_file_name */
81 struct data data[] = {
85 { "normal filename", 0,
86 "normal filename", SANITIZE_ERR_OK
89 "control_char", SANITIZE_ERR_OK
92 "banned_char", SANITIZE_ERR_OK
95 "f_foo", SANITIZE_ERR_OK
97 { "f:foo", SANITIZE_ALLOW_COLONS,
98 "f:foo", SANITIZE_ERR_OK
100 { "f:foo", SANITIZE_ALLOW_PATH,
101 "f:foo", SANITIZE_ERR_OK
104 "f__foo", SANITIZE_ERR_OK
106 { "f:\\foo", SANITIZE_ALLOW_PATH,
107 "f:\\foo", SANITIZE_ERR_OK
110 "f__foo", SANITIZE_ERR_OK
112 { "f:/foo", SANITIZE_ALLOW_PATH,
113 "f:/foo", SANITIZE_ERR_OK
116 { "\\\\?\\C:\\foo", SANITIZE_ALLOW_PATH,
117 "\\\\?\\C:\\foo", SANITIZE_ERR_OK
119 { "\\\\?\\C:\\foo", 0,
120 "____C__foo", SANITIZE_ERR_OK
124 "foo_bar", SANITIZE_ERR_OK
126 { "foo|<>/bar\\\":?*baz", 0,
127 "foo____bar_____baz", SANITIZE_ERR_OK
130 "f_foo__$DATA", SANITIZE_ERR_OK
133 "con _ air", SANITIZE_ERR_OK
136 "con_air", SANITIZE_ERR_OK
139 "con__x", SANITIZE_ERR_OK
141 { "file . . . . .. .", 0,
142 "file", SANITIZE_ERR_OK
144 { "foo . . ? . . ", 0,
145 "foo . . _", SANITIZE_ERR_OK
148 "_com1", SANITIZE_ERR_OK
150 { "com1", SANITIZE_ALLOW_RESERVED,
151 "com1", SANITIZE_ERR_OK
154 "f__com1", SANITIZE_ERR_OK
156 { "f:\\com1", SANITIZE_ALLOW_PATH,
157 "f:\\_com1", SANITIZE_ERR_OK
159 { "f:\\com1", SANITIZE_ALLOW_RESERVED,
160 "f__com1", SANITIZE_ERR_OK
162 { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_COLONS,
163 "f:_com1", SANITIZE_ERR_OK
165 { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
166 "f:\\com1", SANITIZE_ERR_OK
168 { "com1:\\com1", SANITIZE_ALLOW_PATH,
169 "_com1:\\_com1", SANITIZE_ERR_OK
171 { "com1:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
172 "com1:\\com1", SANITIZE_ERR_OK
174 { "com1:\\com1", SANITIZE_ALLOW_RESERVED,
175 "com1__com1", SANITIZE_ERR_OK
178 { "\\com1", SANITIZE_ALLOW_PATH,
179 "\\_com1", SANITIZE_ERR_OK
181 { "\\\\com1", SANITIZE_ALLOW_PATH,
182 "\\\\com1", SANITIZE_ERR_OK
184 { "\\\\?\\C:\\com1", SANITIZE_ALLOW_PATH,
185 "\\\\?\\C:\\com1", SANITIZE_ERR_OK
189 "_CoM1", SANITIZE_ERR_OK
191 { "CoM1", SANITIZE_ALLOW_RESERVED,
192 "CoM1", SANITIZE_ERR_OK
195 "COM56", SANITIZE_ERR_OK
197 /* At the moment we expect a maximum path length of 259. I assume MSDOS
198 has variable max path lengths depending on compiler that are shorter
199 so currently these "good" truncate tests won't run on MSDOS */
201 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
202 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
203 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
204 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
205 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
206 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
207 SANITIZE_ALLOW_TRUNCATE,
208 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
209 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
210 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
211 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
212 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
213 "FFFFF", SANITIZE_ERR_OK
215 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
216 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
217 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
218 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
219 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
220 "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
221 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
222 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
223 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
224 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
225 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
226 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
227 "FFF\\FFFFF", SANITIZE_ERR_OK
229 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
230 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
231 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
232 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
233 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
234 "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
235 SANITIZE_ALLOW_TRUNCATE,
236 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
237 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
238 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
239 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
240 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
241 "FFF_F", SANITIZE_ERR_OK
244 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
245 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
246 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
247 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
248 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
249 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
251 NULL, SANITIZE_ERR_INVALID_PATH
253 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
254 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
255 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
256 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
257 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
258 "FFFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
259 SANITIZE_ALLOW_TRUNCATE,
260 NULL, SANITIZE_ERR_INVALID_PATH
262 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
263 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
264 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
265 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
266 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
267 "FFFFFFFFFFFFFFFFFFFFFFFFF\\FFFFFFFFFFFFFFFFFFFFFFFF",
268 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
269 NULL, SANITIZE_ERR_INVALID_PATH
271 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
272 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
273 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
274 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
275 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
276 "FFF\\FFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFF",
277 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
278 NULL, SANITIZE_ERR_INVALID_PATH
280 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
281 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
282 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
283 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
284 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
285 "FF\\F:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
286 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
287 NULL, SANITIZE_ERR_INVALID_PATH
290 NULL, SANITIZE_ERR_BAD_ARGUMENT
296 for(i = 0; i < sizeof data / sizeof data[0]; ++i) {
298 char *flagstr = NULL;
299 char *received_ccstr = NULL;
300 char *expected_ccstr = NULL;
302 CURLcode res = sanitize_file_name(&output, data[i].input, data[i].flags);
304 if(res == data[i].expected_result &&
305 ((!output && !data[i].expected_output) ||
306 (output && data[i].expected_output &&
307 !strcmp(output, data[i].expected_output)))) { /* OK */
312 flagstr = getflagstr(data[i].flags);
313 received_ccstr = getcurlcodestr(res);
314 expected_ccstr = getcurlcodestr(data[i].expected_result);
318 "%s:%d sanitize_file_name failed.\n"
323 "expected output: %s\n"
324 "expected result: %s\n",
328 (output ? output : "(null)"),
330 (data[i].expected_output ? data[i].expected_output : "(null)"),
335 free(received_ccstr);
336 free(expected_ccstr);
338 } /* END sanitize_file_name */
344 fprintf(stderr, "Skipped test not for this platform\n");
346 #endif /* MSDOS || WIN32 */