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 https://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);
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" : ""));
58 static char *getcurlcodestr(int cc)
60 char *buf = malloc(256);
62 snprintf(buf, 256, "%s (%d)",
63 (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
64 cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
65 cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
66 cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY" :
67 "unexpected error code - add name"),
76 const char *expected_output;
77 CURLcode expected_result;
82 { /* START sanitize_file_name */
83 struct data data[] = {
87 { "normal filename", 0,
88 "normal filename", SANITIZE_ERR_OK
91 "control_char", SANITIZE_ERR_OK
94 "banned_char", SANITIZE_ERR_OK
97 "f_foo", SANITIZE_ERR_OK
99 { "f:foo", SANITIZE_ALLOW_COLONS,
100 "f:foo", SANITIZE_ERR_OK
102 { "f:foo", SANITIZE_ALLOW_PATH,
103 "f:foo", SANITIZE_ERR_OK
106 "f__foo", SANITIZE_ERR_OK
108 { "f:\\foo", SANITIZE_ALLOW_PATH,
109 "f:\\foo", SANITIZE_ERR_OK
112 "f__foo", SANITIZE_ERR_OK
114 { "f:/foo", SANITIZE_ALLOW_PATH,
115 "f:/foo", SANITIZE_ERR_OK
118 { "\\\\?\\C:\\foo", SANITIZE_ALLOW_PATH,
119 "\\\\?\\C:\\foo", SANITIZE_ERR_OK
121 { "\\\\?\\C:\\foo", 0,
122 "____C__foo", SANITIZE_ERR_OK
126 "foo_bar", SANITIZE_ERR_OK
128 { "foo|<>/bar\\\":?*baz", 0,
129 "foo____bar_____baz", SANITIZE_ERR_OK
132 "f_foo__$DATA", SANITIZE_ERR_OK
135 "con _ air", SANITIZE_ERR_OK
138 "con_air", SANITIZE_ERR_OK
141 "con__x", SANITIZE_ERR_OK
143 { "file . . . . .. .", 0,
144 "file", SANITIZE_ERR_OK
146 { "foo . . ? . . ", 0,
147 "foo . . _", SANITIZE_ERR_OK
150 "_com1", SANITIZE_ERR_OK
152 { "com1", SANITIZE_ALLOW_RESERVED,
153 "com1", SANITIZE_ERR_OK
156 "f__com1", SANITIZE_ERR_OK
158 { "f:\\com1", SANITIZE_ALLOW_PATH,
159 "f:\\_com1", SANITIZE_ERR_OK
161 { "f:\\com1", SANITIZE_ALLOW_RESERVED,
162 "f__com1", SANITIZE_ERR_OK
164 { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_COLONS,
165 "f:_com1", SANITIZE_ERR_OK
167 { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
168 "f:\\com1", SANITIZE_ERR_OK
170 { "com1:\\com1", SANITIZE_ALLOW_PATH,
171 "_com1:\\_com1", SANITIZE_ERR_OK
173 { "com1:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
174 "com1:\\com1", SANITIZE_ERR_OK
176 { "com1:\\com1", SANITIZE_ALLOW_RESERVED,
177 "com1__com1", SANITIZE_ERR_OK
180 { "\\com1", SANITIZE_ALLOW_PATH,
181 "\\_com1", SANITIZE_ERR_OK
183 { "\\\\com1", SANITIZE_ALLOW_PATH,
184 "\\\\com1", SANITIZE_ERR_OK
186 { "\\\\?\\C:\\com1", SANITIZE_ALLOW_PATH,
187 "\\\\?\\C:\\com1", SANITIZE_ERR_OK
191 "_CoM1", SANITIZE_ERR_OK
193 { "CoM1", SANITIZE_ALLOW_RESERVED,
194 "CoM1", SANITIZE_ERR_OK
197 "COM56", SANITIZE_ERR_OK
199 /* At the moment we expect a maximum path length of 259. I assume MSDOS
200 has variable max path lengths depending on compiler that are shorter
201 so currently these "good" truncate tests won't run on MSDOS */
203 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
204 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
205 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
206 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
207 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
208 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
209 SANITIZE_ALLOW_TRUNCATE,
210 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
211 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
212 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
213 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
214 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
215 "FFFFF", SANITIZE_ERR_OK
217 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
218 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
219 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
220 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
221 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
222 "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
223 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
224 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
225 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
226 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
227 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
228 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
229 "FFF\\FFFFF", SANITIZE_ERR_OK
231 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
232 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
233 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
234 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
235 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
236 "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
237 SANITIZE_ALLOW_TRUNCATE,
238 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
239 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
240 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
241 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
242 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
243 "FFF_F", SANITIZE_ERR_OK
246 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
247 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
248 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
249 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
250 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
251 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
253 NULL, SANITIZE_ERR_INVALID_PATH
255 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
256 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
257 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
258 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
259 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
260 "FFFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
261 SANITIZE_ALLOW_TRUNCATE,
262 NULL, SANITIZE_ERR_INVALID_PATH
264 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
265 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
266 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
267 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
268 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
269 "FFFFFFFFFFFFFFFFFFFFFFFFF\\FFFFFFFFFFFFFFFFFFFFFFFF",
270 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
271 NULL, SANITIZE_ERR_INVALID_PATH
273 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
274 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
275 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
276 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
277 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
278 "FFF\\FFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFF",
279 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
280 NULL, SANITIZE_ERR_INVALID_PATH
282 { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
283 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
284 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
285 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
286 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
287 "FF\\F:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
288 SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
289 NULL, SANITIZE_ERR_INVALID_PATH
292 NULL, SANITIZE_ERR_BAD_ARGUMENT
298 for(i = 0; i < sizeof data / sizeof data[0]; ++i) {
300 char *flagstr = NULL;
301 char *received_ccstr = NULL;
302 char *expected_ccstr = NULL;
304 CURLcode res = sanitize_file_name(&output, data[i].input, data[i].flags);
306 if(res == data[i].expected_result &&
307 ((!output && !data[i].expected_output) ||
308 (output && data[i].expected_output &&
309 !strcmp(output, data[i].expected_output)))) { /* OK */
314 flagstr = getflagstr(data[i].flags);
315 abort_unless(flagstr, "out of memory");
316 received_ccstr = getcurlcodestr(res);
317 abort_unless(received_ccstr, "out of memory");
318 expected_ccstr = getcurlcodestr(data[i].expected_result);
319 abort_unless(expected_ccstr, "out of memory");
323 "%s:%d sanitize_file_name failed.\n"
328 "expected output: %s\n"
329 "expected result: %s\n",
333 (output ? output : "(null)"),
335 (data[i].expected_output ? data[i].expected_output : "(null)"),
340 free(received_ccstr);
341 free(expected_ccstr);
343 } /* END sanitize_file_name */
349 fprintf(stderr, "Skipped test not for this platform\n");
351 #endif /* MSDOS || WIN32 */