unit1604.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /***************************************************************************
  2. * _ _ ____ _
  3. * Project ___| | | | _ \| |
  4. * / __| | | | |_) | |
  5. * | (__| |_| | _ <| |___
  6. * \___|\___/|_| \_\_____|
  7. *
  8. * Copyright (C) 1998 - 2020, Daniel Stenberg, <[email protected]>, et al.
  9. *
  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.se/docs/copyright.html.
  13. *
  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.
  17. *
  18. * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  19. * KIND, either express or implied.
  20. *
  21. ***************************************************************************/
  22. #include "curlcheck.h"
  23. #include "tool_cfgable.h"
  24. #include "tool_doswin.h"
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include "memdebug.h" /* LAST include file */
  29. static CURLcode unit_setup(void)
  30. {
  31. return CURLE_OK;
  32. }
  33. static void unit_stop(void)
  34. {
  35. }
  36. #if defined(MSDOS) || defined(WIN32)
  37. static char *getflagstr(int flags)
  38. {
  39. char *buf = malloc(256);
  40. if(buf) {
  41. msnprintf(buf, 256, "%s,%s,%s,%s",
  42. ((flags & SANITIZE_ALLOW_COLONS) ?
  43. "SANITIZE_ALLOW_COLONS" : ""),
  44. ((flags & SANITIZE_ALLOW_PATH) ?
  45. "SANITIZE_ALLOW_PATH" : ""),
  46. ((flags & SANITIZE_ALLOW_RESERVED) ?
  47. "SANITIZE_ALLOW_RESERVED" : ""),
  48. ((flags & SANITIZE_ALLOW_TRUNCATE) ?
  49. "SANITIZE_ALLOW_TRUNCATE" : ""));
  50. }
  51. return buf;
  52. }
  53. static char *getcurlcodestr(int cc)
  54. {
  55. char *buf = malloc(256);
  56. if(buf) {
  57. msnprintf(buf, 256, "%s (%d)",
  58. (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
  59. cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
  60. cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
  61. cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY":
  62. "unexpected error code - add name"),
  63. cc);
  64. }
  65. return buf;
  66. }
  67. struct data {
  68. const char *input;
  69. int flags;
  70. const char *expected_output;
  71. SANITIZEcode expected_result;
  72. };
  73. UNITTEST_START
  74. { /* START sanitize_file_name */
  75. struct data data[] = {
  76. { "", 0,
  77. "", SANITIZE_ERR_OK
  78. },
  79. { "normal filename", 0,
  80. "normal filename", SANITIZE_ERR_OK
  81. },
  82. { "control\tchar", 0,
  83. "control_char", SANITIZE_ERR_OK
  84. },
  85. { "banned*char", 0,
  86. "banned_char", SANITIZE_ERR_OK
  87. },
  88. { "f:foo", 0,
  89. "f_foo", SANITIZE_ERR_OK
  90. },
  91. { "f:foo", SANITIZE_ALLOW_COLONS,
  92. "f:foo", SANITIZE_ERR_OK
  93. },
  94. { "f:foo", SANITIZE_ALLOW_PATH,
  95. "f:foo", SANITIZE_ERR_OK
  96. },
  97. { "f:\\foo", 0,
  98. "f__foo", SANITIZE_ERR_OK
  99. },
  100. { "f:\\foo", SANITIZE_ALLOW_PATH,
  101. "f:\\foo", SANITIZE_ERR_OK
  102. },
  103. { "f:/foo", 0,
  104. "f__foo", SANITIZE_ERR_OK
  105. },
  106. { "f:/foo", SANITIZE_ALLOW_PATH,
  107. "f:/foo", SANITIZE_ERR_OK
  108. },
  109. #ifndef MSDOS
  110. { "\\\\?\\C:\\foo", SANITIZE_ALLOW_PATH,
  111. "\\\\?\\C:\\foo", SANITIZE_ERR_OK
  112. },
  113. { "\\\\?\\C:\\foo", 0,
  114. "____C__foo", SANITIZE_ERR_OK
  115. },
  116. #endif
  117. { "foo:bar", 0,
  118. "foo_bar", SANITIZE_ERR_OK
  119. },
  120. { "foo|<>/bar\\\":?*baz", 0,
  121. "foo____bar_____baz", SANITIZE_ERR_OK
  122. },
  123. { "f:foo::$DATA", 0,
  124. "f_foo__$DATA", SANITIZE_ERR_OK
  125. },
  126. { "con . air", 0,
  127. "con _ air", SANITIZE_ERR_OK
  128. },
  129. { "con.air", 0,
  130. "con_air", SANITIZE_ERR_OK
  131. },
  132. { "con:/x", 0,
  133. "con__x", SANITIZE_ERR_OK
  134. },
  135. { "file . . . . .. .", 0,
  136. "file", SANITIZE_ERR_OK
  137. },
  138. { "foo . . ? . . ", 0,
  139. "foo . . _", SANITIZE_ERR_OK
  140. },
  141. { "com1", 0,
  142. "_com1", SANITIZE_ERR_OK
  143. },
  144. { "com1", SANITIZE_ALLOW_RESERVED,
  145. "com1", SANITIZE_ERR_OK
  146. },
  147. { "f:\\com1", 0,
  148. "f__com1", SANITIZE_ERR_OK
  149. },
  150. { "f:\\com1", SANITIZE_ALLOW_PATH,
  151. "f:\\_com1", SANITIZE_ERR_OK
  152. },
  153. { "f:\\com1", SANITIZE_ALLOW_RESERVED,
  154. "f__com1", SANITIZE_ERR_OK
  155. },
  156. { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_COLONS,
  157. "f:_com1", SANITIZE_ERR_OK
  158. },
  159. { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
  160. "f:\\com1", SANITIZE_ERR_OK
  161. },
  162. { "com1:\\com1", SANITIZE_ALLOW_PATH,
  163. "_com1:\\_com1", SANITIZE_ERR_OK
  164. },
  165. { "com1:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
  166. "com1:\\com1", SANITIZE_ERR_OK
  167. },
  168. { "com1:\\com1", SANITIZE_ALLOW_RESERVED,
  169. "com1__com1", SANITIZE_ERR_OK
  170. },
  171. #ifndef MSDOS
  172. { "\\com1", SANITIZE_ALLOW_PATH,
  173. "\\_com1", SANITIZE_ERR_OK
  174. },
  175. { "\\\\com1", SANITIZE_ALLOW_PATH,
  176. "\\\\com1", SANITIZE_ERR_OK
  177. },
  178. { "\\\\?\\C:\\com1", SANITIZE_ALLOW_PATH,
  179. "\\\\?\\C:\\com1", SANITIZE_ERR_OK
  180. },
  181. #endif
  182. { "CoM1", 0,
  183. "_CoM1", SANITIZE_ERR_OK
  184. },
  185. { "CoM1", SANITIZE_ALLOW_RESERVED,
  186. "CoM1", SANITIZE_ERR_OK
  187. },
  188. { "COM56", 0,
  189. "COM56", SANITIZE_ERR_OK
  190. },
  191. /* At the moment we expect a maximum path length of 259. I assume MSDOS
  192. has variable max path lengths depending on compiler that are shorter
  193. so currently these "good" truncate tests won't run on MSDOS */
  194. #ifndef MSDOS
  195. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  196. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  197. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  198. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  199. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  200. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  201. SANITIZE_ALLOW_TRUNCATE,
  202. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  203. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  204. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  205. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  206. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  207. "FFFFF", SANITIZE_ERR_OK
  208. },
  209. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  210. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  211. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  212. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  213. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  214. "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  215. SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
  216. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  217. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  218. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  219. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  220. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  221. "FFF\\FFFFF", SANITIZE_ERR_OK
  222. },
  223. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  224. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  225. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  226. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  227. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  228. "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  229. SANITIZE_ALLOW_TRUNCATE,
  230. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  231. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  232. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  233. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  234. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  235. "FFF_F", SANITIZE_ERR_OK
  236. },
  237. #endif /* !MSDOS */
  238. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  239. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  240. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  241. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  242. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  243. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  244. 0,
  245. NULL, SANITIZE_ERR_INVALID_PATH
  246. },
  247. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  248. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  249. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  250. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  251. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  252. "FFFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  253. SANITIZE_ALLOW_TRUNCATE,
  254. NULL, SANITIZE_ERR_INVALID_PATH
  255. },
  256. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  257. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  258. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  259. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  260. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  261. "FFFFFFFFFFFFFFFFFFFFFFFFF\\FFFFFFFFFFFFFFFFFFFFFFFF",
  262. SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
  263. NULL, SANITIZE_ERR_INVALID_PATH
  264. },
  265. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  266. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  267. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  268. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  269. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  270. "FFF\\FFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFF",
  271. SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
  272. NULL, SANITIZE_ERR_INVALID_PATH
  273. },
  274. { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  275. "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
  276. "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
  277. "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  278. "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
  279. "FF\\F:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  280. SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
  281. NULL, SANITIZE_ERR_INVALID_PATH
  282. },
  283. { NULL, 0,
  284. NULL, SANITIZE_ERR_BAD_ARGUMENT
  285. },
  286. };
  287. size_t i;
  288. for(i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {
  289. char *output = NULL;
  290. char *flagstr = NULL;
  291. char *received_ccstr = NULL;
  292. char *expected_ccstr = NULL;
  293. SANITIZEcode res;
  294. res = sanitize_file_name(&output, data[i].input, data[i].flags);
  295. if(res == data[i].expected_result &&
  296. ((!output && !data[i].expected_output) ||
  297. (output && data[i].expected_output &&
  298. !strcmp(output, data[i].expected_output)))) { /* OK */
  299. free(output);
  300. continue;
  301. }
  302. flagstr = getflagstr(data[i].flags);
  303. abort_unless(flagstr, "out of memory");
  304. received_ccstr = getcurlcodestr(res);
  305. abort_unless(received_ccstr, "out of memory");
  306. expected_ccstr = getcurlcodestr(data[i].expected_result);
  307. abort_unless(expected_ccstr, "out of memory");
  308. unitfail++;
  309. fprintf(stderr, "\n"
  310. "%s:%d sanitize_file_name failed.\n"
  311. "input: %s\n"
  312. "flags: %s\n"
  313. "output: %s\n"
  314. "result: %s\n"
  315. "expected output: %s\n"
  316. "expected result: %s\n",
  317. __FILE__, __LINE__,
  318. data[i].input,
  319. flagstr,
  320. (output ? output : "(null)"),
  321. received_ccstr,
  322. (data[i].expected_output ? data[i].expected_output : "(null)"),
  323. expected_ccstr);
  324. free(output);
  325. free(flagstr);
  326. free(received_ccstr);
  327. free(expected_ccstr);
  328. }
  329. } /* END sanitize_file_name */
  330. #else
  331. UNITTEST_START
  332. {
  333. fprintf(stderr, "Skipped test not for this platform\n");
  334. }
  335. #endif /* MSDOS || WIN32 */
  336. UNITTEST_STOP