ns_tests.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. /* Tests in the "namespace" test case for the Expat test suite
  2. __ __ _
  3. ___\ \/ /_ __ __ _| |_
  4. / _ \\ /| '_ \ / _` | __|
  5. | __// \| |_) | (_| | |_
  6. \___/_/\_\ .__/ \__,_|\__|
  7. |_| XML parser
  8. Copyright (c) 2001-2006 Fred L. Drake, Jr. <[email protected]>
  9. Copyright (c) 2003 Greg Stein <[email protected]>
  10. Copyright (c) 2005-2007 Steven Solie <[email protected]>
  11. Copyright (c) 2005-2012 Karl Waclawek <[email protected]>
  12. Copyright (c) 2016-2023 Sebastian Pipping <[email protected]>
  13. Copyright (c) 2017-2022 Rhodri James <[email protected]>
  14. Copyright (c) 2017 Joe Orton <[email protected]>
  15. Copyright (c) 2017 José Gutiérrez de la Concha <[email protected]>
  16. Copyright (c) 2018 Marco Maggi <[email protected]>
  17. Copyright (c) 2019 David Loffredo <[email protected]>
  18. Copyright (c) 2020 Tim Gates <[email protected]>
  19. Copyright (c) 2021 Donghee Na <[email protected]>
  20. Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]>
  21. Licensed under the MIT license:
  22. Permission is hereby granted, free of charge, to any person obtaining
  23. a copy of this software and associated documentation files (the
  24. "Software"), to deal in the Software without restriction, including
  25. without limitation the rights to use, copy, modify, merge, publish,
  26. distribute, sublicense, and/or sell copies of the Software, and to permit
  27. persons to whom the Software is furnished to do so, subject to the
  28. following conditions:
  29. The above copyright notice and this permission notice shall be included
  30. in all copies or substantial portions of the Software.
  31. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  32. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  33. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  34. NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  35. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  36. OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  37. USE OR OTHER DEALINGS IN THE SOFTWARE.
  38. */
  39. #include "expat_config.h"
  40. #include <string.h>
  41. #include "expat.h"
  42. #include "internal.h"
  43. #include "minicheck.h"
  44. #include "common.h"
  45. #include "dummy.h"
  46. #include "handlers.h"
  47. #include "ns_tests.h"
  48. static void
  49. namespace_setup(void) {
  50. g_parser = XML_ParserCreateNS(NULL, XCS(' '));
  51. if (g_parser == NULL)
  52. fail("Parser not created.");
  53. }
  54. static void
  55. namespace_teardown(void) {
  56. basic_teardown();
  57. }
  58. START_TEST(test_return_ns_triplet) {
  59. const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
  60. " xmlns:bar='http://example.org/'>";
  61. const char *epilog = "</foo:e>";
  62. const XML_Char *elemstr[]
  63. = {XCS("http://example.org/ e foo"), XCS("http://example.org/ a bar")};
  64. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  65. XML_SetUserData(g_parser, (void *)elemstr);
  66. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  67. XML_SetNamespaceDeclHandler(g_parser, dummy_start_namespace_decl_handler,
  68. dummy_end_namespace_decl_handler);
  69. g_triplet_start_flag = XML_FALSE;
  70. g_triplet_end_flag = XML_FALSE;
  71. init_dummy_handlers();
  72. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  73. == XML_STATUS_ERROR)
  74. xml_failure(g_parser);
  75. /* Check that unsetting "return triplets" fails while still parsing */
  76. XML_SetReturnNSTriplet(g_parser, XML_FALSE);
  77. if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
  78. == XML_STATUS_ERROR)
  79. xml_failure(g_parser);
  80. if (! g_triplet_start_flag)
  81. fail("triplet_start_checker not invoked");
  82. if (! g_triplet_end_flag)
  83. fail("triplet_end_checker not invoked");
  84. if (get_dummy_handler_flags()
  85. != (DUMMY_START_NS_DECL_HANDLER_FLAG | DUMMY_END_NS_DECL_HANDLER_FLAG))
  86. fail("Namespace handlers not called");
  87. }
  88. END_TEST
  89. /* Test that the parsing status is correctly reset by XML_ParserReset().
  90. * We use test_return_ns_triplet() for our example parse to improve
  91. * coverage of tidying up code executed.
  92. */
  93. START_TEST(test_ns_parser_reset) {
  94. XML_ParsingStatus status;
  95. XML_GetParsingStatus(g_parser, &status);
  96. if (status.parsing != XML_INITIALIZED)
  97. fail("parsing status doesn't start INITIALIZED");
  98. test_return_ns_triplet();
  99. XML_GetParsingStatus(g_parser, &status);
  100. if (status.parsing != XML_FINISHED)
  101. fail("parsing status doesn't end FINISHED");
  102. XML_ParserReset(g_parser, NULL);
  103. XML_GetParsingStatus(g_parser, &status);
  104. if (status.parsing != XML_INITIALIZED)
  105. fail("parsing status doesn't reset to INITIALIZED");
  106. }
  107. END_TEST
  108. static void
  109. run_ns_tagname_overwrite_test(const char *text, const XML_Char *result) {
  110. CharData storage;
  111. CharData_Init(&storage);
  112. XML_SetUserData(g_parser, &storage);
  113. XML_SetElementHandler(g_parser, overwrite_start_checker,
  114. overwrite_end_checker);
  115. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  116. == XML_STATUS_ERROR)
  117. xml_failure(g_parser);
  118. CharData_CheckXMLChars(&storage, result);
  119. }
  120. /* Regression test for SF bug #566334. */
  121. START_TEST(test_ns_tagname_overwrite) {
  122. const char *text = "<n:e xmlns:n='http://example.org/'>\n"
  123. " <n:f n:attr='foo'/>\n"
  124. " <n:g n:attr2='bar'/>\n"
  125. "</n:e>";
  126. const XML_Char *result = XCS("start http://example.org/ e\n")
  127. XCS("start http://example.org/ f\n")
  128. XCS("attribute http://example.org/ attr\n")
  129. XCS("end http://example.org/ f\n")
  130. XCS("start http://example.org/ g\n")
  131. XCS("attribute http://example.org/ attr2\n")
  132. XCS("end http://example.org/ g\n")
  133. XCS("end http://example.org/ e\n");
  134. run_ns_tagname_overwrite_test(text, result);
  135. }
  136. END_TEST
  137. /* Regression test for SF bug #566334. */
  138. START_TEST(test_ns_tagname_overwrite_triplet) {
  139. const char *text = "<n:e xmlns:n='http://example.org/'>\n"
  140. " <n:f n:attr='foo'/>\n"
  141. " <n:g n:attr2='bar'/>\n"
  142. "</n:e>";
  143. const XML_Char *result = XCS("start http://example.org/ e n\n")
  144. XCS("start http://example.org/ f n\n")
  145. XCS("attribute http://example.org/ attr n\n")
  146. XCS("end http://example.org/ f n\n")
  147. XCS("start http://example.org/ g n\n")
  148. XCS("attribute http://example.org/ attr2 n\n")
  149. XCS("end http://example.org/ g n\n")
  150. XCS("end http://example.org/ e n\n");
  151. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  152. run_ns_tagname_overwrite_test(text, result);
  153. }
  154. END_TEST
  155. /* Regression test for SF bug #620343. */
  156. START_TEST(test_start_ns_clears_start_element) {
  157. /* This needs to use separate start/end tags; using the empty tag
  158. syntax doesn't cause the problematic path through Expat to be
  159. taken.
  160. */
  161. const char *text = "<e xmlns='http://example.org/'></e>";
  162. XML_SetStartElementHandler(g_parser, start_element_fail);
  163. XML_SetStartNamespaceDeclHandler(g_parser, start_ns_clearing_start_element);
  164. XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
  165. XML_UseParserAsHandlerArg(g_parser);
  166. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  167. == XML_STATUS_ERROR)
  168. xml_failure(g_parser);
  169. }
  170. END_TEST
  171. /* Regression test for SF bug #616863. */
  172. START_TEST(test_default_ns_from_ext_subset_and_ext_ge) {
  173. const char *text = "<?xml version='1.0'?>\n"
  174. "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
  175. " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
  176. "]>\n"
  177. "<doc xmlns='http://example.org/ns1'>\n"
  178. "&en;\n"
  179. "</doc>";
  180. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  181. XML_SetExternalEntityRefHandler(g_parser, external_entity_handler);
  182. /* We actually need to set this handler to tickle this bug. */
  183. XML_SetStartElementHandler(g_parser, dummy_start_element);
  184. XML_SetUserData(g_parser, NULL);
  185. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  186. == XML_STATUS_ERROR)
  187. xml_failure(g_parser);
  188. }
  189. END_TEST
  190. /* Regression test #1 for SF bug #673791. */
  191. START_TEST(test_ns_prefix_with_empty_uri_1) {
  192. const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
  193. " <e xmlns:prefix=''/>\n"
  194. "</doc>";
  195. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  196. "Did not report re-setting namespace"
  197. " URI with prefix to ''.");
  198. }
  199. END_TEST
  200. /* Regression test #2 for SF bug #673791. */
  201. START_TEST(test_ns_prefix_with_empty_uri_2) {
  202. const char *text = "<?xml version='1.0'?>\n"
  203. "<docelem xmlns:pre=''/>";
  204. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  205. "Did not report setting namespace URI with prefix to ''.");
  206. }
  207. END_TEST
  208. /* Regression test #3 for SF bug #673791. */
  209. START_TEST(test_ns_prefix_with_empty_uri_3) {
  210. const char *text = "<!DOCTYPE doc [\n"
  211. " <!ELEMENT doc EMPTY>\n"
  212. " <!ATTLIST doc\n"
  213. " xmlns:prefix CDATA ''>\n"
  214. "]>\n"
  215. "<doc/>";
  216. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  217. "Didn't report attr default setting NS w/ prefix to ''.");
  218. }
  219. END_TEST
  220. /* Regression test #4 for SF bug #673791. */
  221. START_TEST(test_ns_prefix_with_empty_uri_4) {
  222. const char *text = "<!DOCTYPE doc [\n"
  223. " <!ELEMENT prefix:doc EMPTY>\n"
  224. " <!ATTLIST prefix:doc\n"
  225. " xmlns:prefix CDATA 'http://example.org/'>\n"
  226. "]>\n"
  227. "<prefix:doc/>";
  228. /* Packaged info expected by the end element handler;
  229. the weird structuring lets us reuse the triplet_end_checker()
  230. function also used for another test. */
  231. const XML_Char *elemstr[] = {XCS("http://example.org/ doc prefix")};
  232. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  233. XML_SetUserData(g_parser, (void *)elemstr);
  234. XML_SetEndElementHandler(g_parser, triplet_end_checker);
  235. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  236. == XML_STATUS_ERROR)
  237. xml_failure(g_parser);
  238. }
  239. END_TEST
  240. /* Test with non-xmlns prefix */
  241. START_TEST(test_ns_unbound_prefix) {
  242. const char *text = "<!DOCTYPE doc [\n"
  243. " <!ELEMENT prefix:doc EMPTY>\n"
  244. " <!ATTLIST prefix:doc\n"
  245. " notxmlns:prefix CDATA 'http://example.org/'>\n"
  246. "]>\n"
  247. "<prefix:doc/>";
  248. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  249. != XML_STATUS_ERROR)
  250. fail("Unbound prefix incorrectly passed");
  251. if (XML_GetErrorCode(g_parser) != XML_ERROR_UNBOUND_PREFIX)
  252. xml_failure(g_parser);
  253. }
  254. END_TEST
  255. START_TEST(test_ns_default_with_empty_uri) {
  256. const char *text = "<doc xmlns='http://example.org/'>\n"
  257. " <e xmlns=''/>\n"
  258. "</doc>";
  259. /* Add some handlers to exercise extra code paths */
  260. XML_SetStartNamespaceDeclHandler(g_parser,
  261. dummy_start_namespace_decl_handler);
  262. XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
  263. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  264. == XML_STATUS_ERROR)
  265. xml_failure(g_parser);
  266. }
  267. END_TEST
  268. /* Regression test for SF bug #692964: two prefixes for one namespace. */
  269. START_TEST(test_ns_duplicate_attrs_diff_prefixes) {
  270. const char *text = "<doc xmlns:a='http://example.org/a'\n"
  271. " xmlns:b='http://example.org/a'\n"
  272. " a:a='v' b:a='v' />";
  273. expect_failure(text, XML_ERROR_DUPLICATE_ATTRIBUTE,
  274. "did not report multiple attributes with same URI+name");
  275. }
  276. END_TEST
  277. START_TEST(test_ns_duplicate_hashes) {
  278. /* The hash of an attribute is calculated as the hash of its URI
  279. * concatenated with a space followed by its name (after the
  280. * colon). We wish to generate attributes with the same hash
  281. * value modulo the attribute table size so that we can check that
  282. * the attribute hash table works correctly. The attribute hash
  283. * table size will be the smallest power of two greater than the
  284. * number of attributes, but at least eight. There is
  285. * unfortunately no programmatic way of getting the hash or the
  286. * table size at user level, but the test code coverage percentage
  287. * will drop if the hashes cease to point to the same row.
  288. *
  289. * The cunning plan is to have few enough attributes to have a
  290. * reliable table size of 8, and have the single letter attribute
  291. * names be 8 characters apart, producing a hash which will be the
  292. * same modulo 8.
  293. */
  294. const char *text = "<doc xmlns:a='http://example.org/a'\n"
  295. " a:a='v' a:i='w' />";
  296. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  297. == XML_STATUS_ERROR)
  298. xml_failure(g_parser);
  299. }
  300. END_TEST
  301. /* Regression test for SF bug #695401: unbound prefix. */
  302. START_TEST(test_ns_unbound_prefix_on_attribute) {
  303. const char *text = "<doc a:attr=''/>";
  304. expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
  305. "did not report unbound prefix on attribute");
  306. }
  307. END_TEST
  308. /* Regression test for SF bug #695401: unbound prefix. */
  309. START_TEST(test_ns_unbound_prefix_on_element) {
  310. const char *text = "<a:doc/>";
  311. expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
  312. "did not report unbound prefix on element");
  313. }
  314. END_TEST
  315. /* Test that long element names with namespaces are handled correctly */
  316. START_TEST(test_ns_long_element) {
  317. const char *text
  318. = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
  319. " xmlns:foo='http://example.org/' bar:a='12'\n"
  320. " xmlns:bar='http://example.org/'>"
  321. "</foo:thisisalongenoughelementnametotriggerareallocation>";
  322. const XML_Char *elemstr[]
  323. = {XCS("http://example.org/")
  324. XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
  325. XCS("http://example.org/ a bar")};
  326. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  327. XML_SetUserData(g_parser, (void *)elemstr);
  328. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  329. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  330. == XML_STATUS_ERROR)
  331. xml_failure(g_parser);
  332. }
  333. END_TEST
  334. /* Test mixed population of prefixed and unprefixed attributes */
  335. START_TEST(test_ns_mixed_prefix_atts) {
  336. const char *text = "<e a='12' bar:b='13'\n"
  337. " xmlns:bar='http://example.org/'>"
  338. "</e>";
  339. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  340. == XML_STATUS_ERROR)
  341. xml_failure(g_parser);
  342. }
  343. END_TEST
  344. /* Test having a long namespaced element name inside a short one.
  345. * This exercises some internal buffer reallocation that is shared
  346. * across elements with the same namespace URI.
  347. */
  348. START_TEST(test_ns_extend_uri_buffer) {
  349. const char *text = "<foo:e xmlns:foo='http://example.org/'>"
  350. " <foo:thisisalongenoughnametotriggerallocationaction"
  351. " foo:a='12' />"
  352. "</foo:e>";
  353. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  354. == XML_STATUS_ERROR)
  355. xml_failure(g_parser);
  356. }
  357. END_TEST
  358. /* Test that xmlns is correctly rejected as an attribute in the xmlns
  359. * namespace, but not in other namespaces
  360. */
  361. START_TEST(test_ns_reserved_attributes) {
  362. const char *text1
  363. = "<foo:e xmlns:foo='http://example.org/' xmlns:xmlns='12' />";
  364. const char *text2
  365. = "<foo:e xmlns:foo='http://example.org/' foo:xmlns='12' />";
  366. expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XMLNS,
  367. "xmlns not rejected as an attribute");
  368. XML_ParserReset(g_parser, NULL);
  369. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  370. == XML_STATUS_ERROR)
  371. xml_failure(g_parser);
  372. }
  373. END_TEST
  374. /* Test more reserved attributes */
  375. START_TEST(test_ns_reserved_attributes_2) {
  376. const char *text1 = "<foo:e xmlns:foo='http://example.org/'"
  377. " xmlns:xml='http://example.org/' />";
  378. const char *text2
  379. = "<foo:e xmlns:foo='http://www.w3.org/XML/1998/namespace' />";
  380. const char *text3 = "<foo:e xmlns:foo='http://www.w3.org/2000/xmlns/' />";
  381. expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XML,
  382. "xml not rejected as an attribute");
  383. XML_ParserReset(g_parser, NULL);
  384. expect_failure(text2, XML_ERROR_RESERVED_NAMESPACE_URI,
  385. "Use of w3.org URL not faulted");
  386. XML_ParserReset(g_parser, NULL);
  387. expect_failure(text3, XML_ERROR_RESERVED_NAMESPACE_URI,
  388. "Use of w3.org xmlns URL not faulted");
  389. }
  390. END_TEST
  391. /* Test string pool handling of namespace names of 2048 characters */
  392. /* Exercises a particular string pool growth path */
  393. START_TEST(test_ns_extremely_long_prefix) {
  394. /* C99 compilers are only required to support 4095-character
  395. * strings, so the following needs to be split in two to be safe
  396. * for all compilers.
  397. */
  398. const char *text1
  399. = "<doc "
  400. /* 64 character on each line */
  401. /* ...gives a total length of 2048 */
  402. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  403. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  404. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  405. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  406. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  407. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  408. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  409. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  410. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  411. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  412. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  413. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  414. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  415. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  416. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  417. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  418. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  419. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  420. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  421. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  422. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  423. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  424. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  425. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  426. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  427. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  428. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  429. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  430. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  431. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  432. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  433. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  434. ":a='12'";
  435. const char *text2
  436. = " xmlns:"
  437. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  438. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  439. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  440. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  441. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  442. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  443. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  444. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  445. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  446. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  447. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  448. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  449. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  450. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  451. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  452. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  453. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  454. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  455. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  456. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  457. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  458. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  459. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  460. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  461. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  462. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  463. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  464. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  465. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  466. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  467. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  468. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  469. "='foo'\n>"
  470. "</doc>";
  471. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  472. == XML_STATUS_ERROR)
  473. xml_failure(g_parser);
  474. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  475. == XML_STATUS_ERROR)
  476. xml_failure(g_parser);
  477. }
  478. END_TEST
  479. /* Test unknown encoding handlers in namespace setup */
  480. START_TEST(test_ns_unknown_encoding_success) {
  481. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  482. "<foo:e xmlns:foo='http://example.org/'>Hi</foo:e>";
  483. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  484. run_character_check(text, XCS("Hi"));
  485. }
  486. END_TEST
  487. /* Test that too many colons are rejected */
  488. START_TEST(test_ns_double_colon) {
  489. const char *text = "<foo:e xmlns:foo='http://example.org/' foo:a:b='bar' />";
  490. const enum XML_Status status
  491. = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  492. #ifdef XML_NS
  493. if ((status == XML_STATUS_OK)
  494. || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
  495. fail("Double colon in attribute name not faulted"
  496. " (despite active namespace support)");
  497. }
  498. #else
  499. if (status != XML_STATUS_OK) {
  500. fail("Double colon in attribute name faulted"
  501. " (despite inactive namespace support");
  502. }
  503. #endif
  504. }
  505. END_TEST
  506. START_TEST(test_ns_double_colon_element) {
  507. const char *text = "<foo:bar:e xmlns:foo='http://example.org/' />";
  508. const enum XML_Status status
  509. = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  510. #ifdef XML_NS
  511. if ((status == XML_STATUS_OK)
  512. || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
  513. fail("Double colon in element name not faulted"
  514. " (despite active namespace support)");
  515. }
  516. #else
  517. if (status != XML_STATUS_OK) {
  518. fail("Double colon in element name faulted"
  519. " (despite inactive namespace support");
  520. }
  521. #endif
  522. }
  523. END_TEST
  524. /* Test that non-name characters after a colon are rejected */
  525. START_TEST(test_ns_bad_attr_leafname) {
  526. const char *text = "<foo:e xmlns:foo='http://example.org/' foo:?ar='baz' />";
  527. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  528. "Invalid character in leafname not faulted");
  529. }
  530. END_TEST
  531. START_TEST(test_ns_bad_element_leafname) {
  532. const char *text = "<foo:?oc xmlns:foo='http://example.org/' />";
  533. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  534. "Invalid character in element leafname not faulted");
  535. }
  536. END_TEST
  537. /* Test high-byte-set UTF-16 characters are valid in a leafname */
  538. START_TEST(test_ns_utf16_leafname) {
  539. const char text[] =
  540. /* <n:e xmlns:n='URI' n:{KHO KHWAI}='a' />
  541. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  542. */
  543. "<\0n\0:\0e\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0 \0"
  544. "n\0:\0\x04\x0e=\0'\0a\0'\0 \0/\0>\0";
  545. const XML_Char *expected = XCS("a");
  546. CharData storage;
  547. CharData_Init(&storage);
  548. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  549. XML_SetUserData(g_parser, &storage);
  550. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  551. == XML_STATUS_ERROR)
  552. xml_failure(g_parser);
  553. CharData_CheckXMLChars(&storage, expected);
  554. }
  555. END_TEST
  556. START_TEST(test_ns_utf16_element_leafname) {
  557. const char text[] =
  558. /* <n:{KHO KHWAI} xmlns:n='URI'/>
  559. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  560. */
  561. "\0<\0n\0:\x0e\x04\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0/\0>";
  562. #ifdef XML_UNICODE
  563. const XML_Char *expected = XCS("URI \x0e04");
  564. #else
  565. const XML_Char *expected = XCS("URI \xe0\xb8\x84");
  566. #endif
  567. CharData storage;
  568. CharData_Init(&storage);
  569. XML_SetStartElementHandler(g_parser, start_element_event_handler);
  570. XML_SetUserData(g_parser, &storage);
  571. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  572. == XML_STATUS_ERROR)
  573. xml_failure(g_parser);
  574. CharData_CheckXMLChars(&storage, expected);
  575. }
  576. END_TEST
  577. START_TEST(test_ns_utf16_doctype) {
  578. const char text[] =
  579. /* <!DOCTYPE foo:{KHO KHWAI} [ <!ENTITY bar 'baz'> ]>\n
  580. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  581. */
  582. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0f\0o\0o\0:\x0e\x04\0 "
  583. "\0[\0 \0<\0!\0E\0N\0T\0I\0T\0Y\0 \0b\0a\0r\0 \0'\0b\0a\0z\0'\0>\0 "
  584. "\0]\0>\0\n"
  585. /* <foo:{KHO KHWAI} xmlns:foo='URI'>&bar;</foo:{KHO KHWAI}> */
  586. "\0<\0f\0o\0o\0:\x0e\x04\0 "
  587. "\0x\0m\0l\0n\0s\0:\0f\0o\0o\0=\0'\0U\0R\0I\0'\0>"
  588. "\0&\0b\0a\0r\0;"
  589. "\0<\0/\0f\0o\0o\0:\x0e\x04\0>";
  590. #ifdef XML_UNICODE
  591. const XML_Char *expected = XCS("URI \x0e04");
  592. #else
  593. const XML_Char *expected = XCS("URI \xe0\xb8\x84");
  594. #endif
  595. CharData storage;
  596. CharData_Init(&storage);
  597. XML_SetUserData(g_parser, &storage);
  598. XML_SetStartElementHandler(g_parser, start_element_event_handler);
  599. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  600. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  601. == XML_STATUS_ERROR)
  602. xml_failure(g_parser);
  603. CharData_CheckXMLChars(&storage, expected);
  604. }
  605. END_TEST
  606. START_TEST(test_ns_invalid_doctype) {
  607. const char *text = "<!DOCTYPE foo:!bad [ <!ENTITY bar 'baz' ]>\n"
  608. "<foo:!bad>&bar;</foo:!bad>";
  609. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  610. "Invalid character in document local name not faulted");
  611. }
  612. END_TEST
  613. START_TEST(test_ns_double_colon_doctype) {
  614. const char *text = "<!DOCTYPE foo:a:doc [ <!ENTITY bar 'baz' ]>\n"
  615. "<foo:a:doc>&bar;</foo:a:doc>";
  616. expect_failure(text, XML_ERROR_SYNTAX,
  617. "Double colon in document name not faulted");
  618. }
  619. END_TEST
  620. START_TEST(test_ns_separator_in_uri) {
  621. struct test_case {
  622. enum XML_Status expectedStatus;
  623. const char *doc;
  624. XML_Char namesep;
  625. };
  626. struct test_case cases[] = {
  627. {XML_STATUS_OK, "<doc xmlns='one_two' />", XCS('\n')},
  628. {XML_STATUS_ERROR, "<doc xmlns='one&#x0A;two' />", XCS('\n')},
  629. {XML_STATUS_OK, "<doc xmlns='one:two' />", XCS(':')},
  630. };
  631. size_t i = 0;
  632. size_t failCount = 0;
  633. for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
  634. set_subtest("%s", cases[i].doc);
  635. XML_Parser parser = XML_ParserCreateNS(NULL, cases[i].namesep);
  636. XML_SetElementHandler(parser, dummy_start_element, dummy_end_element);
  637. if (_XML_Parse_SINGLE_BYTES(parser, cases[i].doc, (int)strlen(cases[i].doc),
  638. /*isFinal*/ XML_TRUE)
  639. != cases[i].expectedStatus) {
  640. failCount++;
  641. }
  642. XML_ParserFree(parser);
  643. }
  644. if (failCount) {
  645. fail("Namespace separator handling is broken");
  646. }
  647. }
  648. END_TEST
  649. void
  650. make_namespace_test_case(Suite *s) {
  651. TCase *tc_namespace = tcase_create("XML namespaces");
  652. suite_add_tcase(s, tc_namespace);
  653. tcase_add_checked_fixture(tc_namespace, namespace_setup, namespace_teardown);
  654. tcase_add_test(tc_namespace, test_return_ns_triplet);
  655. tcase_add_test(tc_namespace, test_ns_parser_reset);
  656. tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
  657. tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
  658. tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
  659. tcase_add_test__ifdef_xml_dtd(tc_namespace,
  660. test_default_ns_from_ext_subset_and_ext_ge);
  661. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
  662. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
  663. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
  664. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
  665. tcase_add_test(tc_namespace, test_ns_unbound_prefix);
  666. tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
  667. tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
  668. tcase_add_test(tc_namespace, test_ns_duplicate_hashes);
  669. tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
  670. tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
  671. tcase_add_test(tc_namespace, test_ns_long_element);
  672. tcase_add_test(tc_namespace, test_ns_mixed_prefix_atts);
  673. tcase_add_test(tc_namespace, test_ns_extend_uri_buffer);
  674. tcase_add_test(tc_namespace, test_ns_reserved_attributes);
  675. tcase_add_test(tc_namespace, test_ns_reserved_attributes_2);
  676. tcase_add_test(tc_namespace, test_ns_extremely_long_prefix);
  677. tcase_add_test(tc_namespace, test_ns_unknown_encoding_success);
  678. tcase_add_test(tc_namespace, test_ns_double_colon);
  679. tcase_add_test(tc_namespace, test_ns_double_colon_element);
  680. tcase_add_test(tc_namespace, test_ns_bad_attr_leafname);
  681. tcase_add_test(tc_namespace, test_ns_bad_element_leafname);
  682. tcase_add_test(tc_namespace, test_ns_utf16_leafname);
  683. tcase_add_test(tc_namespace, test_ns_utf16_element_leafname);
  684. tcase_add_test__if_xml_ge(tc_namespace, test_ns_utf16_doctype);
  685. tcase_add_test(tc_namespace, test_ns_invalid_doctype);
  686. tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
  687. tcase_add_test(tc_namespace, test_ns_separator_in_uri);
  688. }