| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154 |
- /* Tests in the "allocation" test case for the Expat test suite
- __ __ _
- ___\ \/ /_ __ __ _| |_
- / _ \\ /| '_ \ / _` | __|
- | __// \| |_) | (_| | |_
- \___/_/\_\ .__/ \__,_|\__|
- |_| XML parser
- Copyright (c) 2001-2006 Fred L. Drake, Jr. <[email protected]>
- Copyright (c) 2003 Greg Stein <[email protected]>
- Copyright (c) 2005-2007 Steven Solie <[email protected]>
- Copyright (c) 2005-2012 Karl Waclawek <[email protected]>
- Copyright (c) 2016-2023 Sebastian Pipping <[email protected]>
- Copyright (c) 2017-2022 Rhodri James <[email protected]>
- Copyright (c) 2017 Joe Orton <[email protected]>
- Copyright (c) 2017 José Gutiérrez de la Concha <[email protected]>
- Copyright (c) 2018 Marco Maggi <[email protected]>
- Copyright (c) 2019 David Loffredo <[email protected]>
- Copyright (c) 2020 Tim Gates <[email protected]>
- Copyright (c) 2021 Donghee Na <[email protected]>
- Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]>
- Copyright (c) 2025 Berkay Eren Ürün <[email protected]>
- Licensed under the MIT license:
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to permit
- persons to whom the Software is furnished to do so, subject to the
- following conditions:
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- #if defined(NDEBUG)
- # undef NDEBUG /* because test suite relies on assert(...) at the moment */
- #endif
- #include <string.h>
- #include <assert.h>
- #include "expat.h"
- #include "common.h"
- #include "minicheck.h"
- #include "dummy.h"
- #include "handlers.h"
- #include "alloc_tests.h"
- static void
- alloc_setup(void) {
- XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
- /* Ensure the parser creation will go through */
- g_allocation_count = ALLOC_ALWAYS_SUCCEED;
- g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
- g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
- if (g_parser == NULL)
- fail("Parser not created");
- }
- static void
- alloc_teardown(void) {
- basic_teardown();
- }
- /* Test the effects of allocation failures on xml declaration processing */
- START_TEST(test_alloc_parse_xdecl) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>Hello, world</doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* Resetting the parser is insufficient, because some memory
- * allocations are cached within the parser. Instead we use
- * the teardown and setup routines to ensure that we have the
- * right sort of parser back in our hands.
- */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- /* As above, but with an encoding big enough to cause storing the
- * version information to expand the string pool being used.
- */
- START_TEST(test_alloc_parse_xdecl_2) {
- const char *text
- = "<?xml version='1.0' encoding='"
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
- "'?>"
- "<doc>Hello, world</doc>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
- XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- /* Test the effects of allocation failures on a straightforward parse */
- START_TEST(test_alloc_parse_pi) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<?pi unknown?>\n"
- "<doc>"
- "Hello, world"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- START_TEST(test_alloc_parse_pi_2) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>"
- "Hello, world"
- "<?pi unknown?>\n"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- START_TEST(test_alloc_parse_pi_3) {
- const char *text
- = "<?"
- /* 64 characters per line */
- "This processing instruction should be long enough to ensure that"
- "it triggers the growth of an internal string pool when the "
- "allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "Q?><doc/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- START_TEST(test_alloc_parse_comment) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!-- Test parsing this comment -->"
- "<doc>Hi</doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- START_TEST(test_alloc_parse_comment_2) {
- const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<doc>"
- "Hello, world"
- "<!-- Parse this comment too -->"
- "</doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed with max allocations");
- }
- END_TEST
- /* Test that external parser creation running out of memory is
- * correctly reported. Based on the external entity test cases.
- */
- START_TEST(test_alloc_create_external_parser) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, foo_text);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_duff_loader);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR) {
- fail("External parser allocator returned success incorrectly");
- }
- }
- END_TEST
- /* More external parser memory allocation testing */
- START_TEST(test_alloc_run_external_parser) {
- const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<!DOCTYPE doc SYSTEM 'foo'>\n"
- "<doc>&entity;</doc>";
- char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
- unsigned int i;
- const unsigned int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, foo_text);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing ignored failing allocator");
- else if (i == max_alloc_count)
- fail("Parsing failed with allocation count 10");
- }
- END_TEST
- /* Test that running out of memory in dtdCopy is correctly reported.
- * Based on test_default_ns_from_ext_subset_and_ext_ge()
- */
- START_TEST(test_alloc_dtd_copy_default_atts) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
- " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/ns1'>\n"
- "&en;\n"
- "</doc>";
- int callno = 0;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler);
- XML_SetUserData(g_parser, &callno);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_ERROR)
- xml_failure(g_parser);
- }
- END_TEST
- /* Test more external entity allocation failure paths */
- START_TEST(test_alloc_external_entity) {
- const char *text = "<?xml version='1.0'?>\n"
- "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
- " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
- "]>\n"
- "<doc xmlns='http://example.org/ns1'>\n"
- "&en;\n"
- "</doc>";
- int i;
- const int alloc_test_max_repeats = 50;
- int callno = 0;
- for (i = 0; i < alloc_test_max_repeats; i++) {
- g_allocation_count = -1;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler_2);
- callno = 0;
- XML_SetUserData(g_parser, &callno);
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- g_allocation_count = -1;
- if (i == 0)
- fail("External entity parsed despite duff allocator");
- if (i == alloc_test_max_repeats)
- fail("External entity not parsed at max allocation count");
- }
- END_TEST
- /* Test more allocation failure paths */
- START_TEST(test_alloc_ext_entity_set_encoding) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int i;
- const int max_allocation_count = 30;
- for (i = 0; i < max_allocation_count; i++) {
- XML_SetExternalEntityRefHandler(g_parser,
- external_entity_alloc_set_encoding);
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- g_allocation_count = -1;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Encoding check succeeded despite failing allocator");
- if (i == max_allocation_count)
- fail("Encoding failed at max allocation count");
- }
- END_TEST
- /* Test the effects of allocation failure in internal entities.
- * Based on test_unknown_encoding_internal_entity
- */
- START_TEST(test_alloc_internal_entity) {
- const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
- "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
- "<test a='&foo;'/>";
- unsigned int i;
- const unsigned int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetUnknownEncodingHandler(g_parser, unknown_released_encoding_handler,
- NULL);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Internal entity worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Internal entity failed at max allocation count");
- }
- END_TEST
- START_TEST(test_alloc_parameter_entity) {
- const char *text = "<!DOCTYPE foo ["
- "<!ENTITY % param1 \"<!ENTITY internal 'some_text'>\">"
- "%param1;"
- "]> <foo>&internal;content</foo>";
- int i;
- const int alloc_test_max_repeats = 30;
- for (i = 0; i < alloc_test_max_repeats; i++) {
- g_allocation_count = i;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- alloc_teardown();
- alloc_setup();
- }
- g_allocation_count = -1;
- if (i == 0)
- fail("Parameter entity processed despite duff allocator");
- if (i == alloc_test_max_repeats)
- fail("Parameter entity not processed at max allocation count");
- }
- END_TEST
- /* Test the robustness against allocation failure of element handling
- * Based on test_dtd_default_handling().
- */
- START_TEST(test_alloc_dtd_default_handling) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
- "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
- "<!ENTITY e1 SYSTEM 'http://example.org/e' NDATA n>\n"
- "<!ELEMENT doc (#PCDATA)>\n"
- "<!ATTLIST doc a CDATA #IMPLIED>\n"
- "<?pi in dtd?>\n"
- "<!--comment in dtd-->\n"
- "]>\n"
- "<doc><![CDATA[text in doc]]></doc>";
- const XML_Char *expected = XCS("\n\n\n\n\n\n\n\n\n<doc>text in doc</doc>");
- CharData storage;
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetDefaultHandler(g_parser, accumulate_characters);
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
- dummy_end_doctype_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- XML_SetCdataSectionHandler(g_parser, dummy_start_cdata_handler,
- dummy_end_cdata_handler);
- XML_SetUnparsedEntityDeclHandler(g_parser,
- dummy_unparsed_entity_decl_handler);
- CharData_Init(&storage);
- XML_SetUserData(g_parser, &storage);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Default DTD parsed despite allocation failures");
- if (i == max_alloc_count)
- fail("Default DTD not parsed with maximum alloc count");
- CharData_CheckXMLChars(&storage, expected);
- if (get_dummy_handler_flags()
- != (DUMMY_START_DOCTYPE_HANDLER_FLAG | DUMMY_END_DOCTYPE_HANDLER_FLAG
- | DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG
- | DUMMY_ELEMENT_DECL_HANDLER_FLAG | DUMMY_ATTLIST_DECL_HANDLER_FLAG
- | DUMMY_COMMENT_HANDLER_FLAG | DUMMY_PI_HANDLER_FLAG
- | DUMMY_START_CDATA_HANDLER_FLAG | DUMMY_END_CDATA_HANDLER_FLAG
- | DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG))
- fail("Not all handlers were called");
- }
- END_TEST
- /* Test robustness of XML_SetEncoding() with a failing allocator */
- START_TEST(test_alloc_explicit_encoding) {
- int i;
- const int max_alloc_count = 5;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (XML_SetEncoding(g_parser, XCS("us-ascii")) == XML_STATUS_OK)
- break;
- }
- if (i == 0)
- fail("Encoding set despite failing allocator");
- else if (i == max_alloc_count)
- fail("Encoding not set at max allocation count");
- }
- END_TEST
- /* Test robustness of XML_SetBase against a failing allocator */
- START_TEST(test_alloc_set_base) {
- const XML_Char *new_base = XCS("/local/file/name.xml");
- int i;
- const int max_alloc_count = 5;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (XML_SetBase(g_parser, new_base) == XML_STATUS_OK)
- break;
- }
- if (i == 0)
- fail("Base set despite failing allocator");
- else if (i == max_alloc_count)
- fail("Base not set with max allocation count");
- }
- END_TEST
- /* Test buffer extension in the face of a duff reallocator */
- START_TEST(test_alloc_realloc_buffer) {
- const char *text = get_buffer_test_text;
- void *buffer;
- int i;
- const int max_realloc_count = 10;
- /* Get a smallish buffer */
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- buffer = XML_GetBuffer(g_parser, 1536);
- if (buffer == NULL)
- fail("1.5K buffer reallocation failed");
- assert(buffer != NULL);
- memcpy(buffer, text, strlen(text));
- if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- g_reallocation_count = -1;
- if (i == 0)
- fail("Parse succeeded with no reallocation");
- else if (i == max_realloc_count)
- fail("Parse failed with max reallocation count");
- }
- END_TEST
- /* Same test for external entity parsers */
- START_TEST(test_alloc_ext_entity_realloc_buffer) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
- "]>\n"
- "<doc>&en;</doc>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- XML_SetExternalEntityRefHandler(g_parser, external_entity_reallocator);
- XML_SetUserData(g_parser, &i);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- == XML_STATUS_OK)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Succeeded with no reallocations");
- if (i == max_realloc_count)
- fail("Failed with max reallocations");
- }
- END_TEST
- /* Test elements with many attributes are handled correctly */
- START_TEST(test_alloc_realloc_many_attributes) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ATTLIST doc za CDATA 'default'>\n"
- "<!ATTLIST doc zb CDATA 'def2'>\n"
- "<!ATTLIST doc zc CDATA 'def3'>\n"
- "]>\n"
- "<doc a='1'"
- " b='2'"
- " c='3'"
- " d='4'"
- " e='5'"
- " f='6'"
- " g='7'"
- " h='8'"
- " i='9'"
- " j='10'"
- " k='11'"
- " l='12'"
- " m='13'"
- " n='14'"
- " p='15'"
- " q='16'"
- " r='17'"
- " s='18'>"
- "</doc>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite no reallocations");
- if (i == max_realloc_count)
- fail("Parse failed at max reallocations");
- }
- END_TEST
- /* Test handling of a public entity with failing allocator */
- START_TEST(test_alloc_public_entity_value) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc></doc>\n";
- char dtd_text[]
- = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % e1 PUBLIC 'foo' 'bar.ent'>\n"
- "<!ENTITY % "
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " '%e1;'>\n"
- "%e1;\n";
- int i;
- const int max_alloc_count = 50;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
- /* Provoke a particular code path */
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocation");
- if (i == max_alloc_count)
- fail("Parsing failed at max allocation count");
- if (get_dummy_handler_flags() != DUMMY_ENTITY_DECL_HANDLER_FLAG)
- fail("Entity declaration handler not called");
- }
- END_TEST
- START_TEST(test_alloc_realloc_subst_public_entity_value) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc></doc>\n";
- char dtd_text[]
- = "<!ELEMENT doc EMPTY>\n"
- "<!ENTITY % "
- /* Each line is 64 characters */
- "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " PUBLIC 'foo' 'bar.ent'>\n"
- "%ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP;";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocation");
- if (i == max_realloc_count)
- fail("Parsing failed at max reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_parse_public_doctype) {
- const char *text
- = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!DOCTYPE doc PUBLIC '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "' 'test'>\n"
- "<doc></doc>";
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
- dummy_end_doctype_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags()
- != (DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG
- | DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG))
- fail("Doctype handler functions not called");
- }
- END_TEST
- START_TEST(test_alloc_parse_public_doctype_long_name) {
- const char *text
- = "<?xml version='1.0' encoding='utf-8'?>\n"
- "<!DOCTYPE doc PUBLIC 'http://example.com/foo' '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
- "'>\n"
- "<doc></doc>";
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
- dummy_end_doctype_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test foreign DTD handling */
- START_TEST(test_alloc_set_foreign_dtd) {
- const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
- "<doc>&entity;</doc>";
- char text2[] = "<!ELEMENT doc (#PCDATA)*>";
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetUserData(g_parser, &text2);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
- fail("Could not set foreign DTD");
- if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test based on ibm/valid/P32/ibm32v04.xml */
- START_TEST(test_alloc_attribute_enum_value) {
- const char *text = "<?xml version='1.0' standalone='no'?>\n"
- "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
- "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
- char dtd_text[] = "<!ELEMENT animal (#PCDATA|a)*>\n"
- "<!ELEMENT a EMPTY>\n"
- "<!ATTLIST animal xml:space (default|preserve) 'preserve'>";
- int i;
- const int max_alloc_count = 30;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- /* An attribute list handler provokes a different code path */
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test attribute enums sufficient to overflow the string pool */
- START_TEST(test_alloc_realloc_attribute_enum_value) {
- const char *text = "<?xml version='1.0' standalone='no'?>\n"
- "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
- "<animal>This is a yellow tiger</animal>";
- /* We wish to define a collection of attribute enums that will
- * cause the string pool storing them to have to expand. This
- * means more than 1024 bytes, including the parentheses and
- * separator bars.
- */
- char dtd_text[]
- = "<!ELEMENT animal (#PCDATA)*>\n"
- "<!ATTLIST animal thing "
- "(default"
- /* Each line is 64 characters */
- "|ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO)"
- " 'default'>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- /* An attribute list handler provokes a different code path */
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- /* Test attribute enums in a #IMPLIED attribute forcing pool growth */
- START_TEST(test_alloc_realloc_implied_attribute) {
- /* Forcing this particular code path is a balancing act. The
- * addition of the closing parenthesis and terminal NUL must be
- * what pushes the string of enums over the 1024-byte limit,
- * otherwise a different code path will pick up the realloc.
- */
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc EMPTY>\n"
- "<!ATTLIST doc a "
- /* Each line is 64 characters */
- "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
- " #IMPLIED>\n"
- "]><doc/>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- /* Test attribute enums in a defaulted attribute forcing pool growth */
- START_TEST(test_alloc_realloc_default_attribute) {
- /* Forcing this particular code path is a balancing act. The
- * addition of the closing parenthesis and terminal NUL must be
- * what pushes the string of enums over the 1024-byte limit,
- * otherwise a different code path will pick up the realloc.
- */
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc EMPTY>\n"
- "<!ATTLIST doc a "
- /* Each line is 64 characters */
- "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
- "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
- " 'ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO'"
- ">\n]><doc/>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- /* Test long notation name with dodgy allocator */
- START_TEST(test_alloc_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION "
- /* Each line is 64 characters */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- " SYSTEM 'http://example.org/n'>\n"
- "<!ENTITY e SYSTEM 'http://example.org/e' NDATA "
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- ">\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags()
- != (DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG))
- fail("Entity declaration handler not called");
- }
- END_TEST
- /* Test public notation with dodgy allocator */
- START_TEST(test_alloc_public_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION note PUBLIC '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "' 'foo'>\n"
- "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
- fail("Notation handler not called");
- }
- END_TEST
- /* Test public notation with dodgy allocator */
- START_TEST(test_alloc_system_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!NOTATION note SYSTEM '"
- /* 64 characters per line */
- "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
- "'>\n"
- "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
- "<!ELEMENT doc EMPTY>\n"
- "]>\n<doc/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- init_dummy_handlers();
- XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite allocation failures");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
- fail("Notation handler not called");
- }
- END_TEST
- START_TEST(test_alloc_nested_groups) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc "
- /* Sixteen elements per line */
- "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
- "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
- "))))))))))))))))))))))))))))))))>\n"
- "<!ELEMENT e EMPTY>"
- "]>\n"
- "<doc><e/></doc>";
- CharData storage;
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- CharData_Init(&storage);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum reallocation count");
- CharData_CheckXMLChars(&storage, XCS("doce"));
- if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler not fired");
- }
- END_TEST
- START_TEST(test_alloc_realloc_nested_groups) {
- const char *text
- = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc "
- /* Sixteen elements per line */
- "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
- "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
- "))))))))))))))))))))))))))))))))>\n"
- "<!ELEMENT e EMPTY>"
- "]>\n"
- "<doc><e/></doc>";
- CharData storage;
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- CharData_Init(&storage);
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- XML_SetStartElementHandler(g_parser, record_element_start_handler);
- XML_SetUserData(g_parser, &storage);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- CharData_CheckXMLChars(&storage, XCS("doce"));
- if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler not fired");
- }
- END_TEST
- START_TEST(test_alloc_large_group) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc ("
- "a1|a2|a3|a4|a5|a6|a7|a8|"
- "b1|b2|b3|b4|b5|b6|b7|b8|"
- "c1|c2|c3|c4|c5|c6|c7|c8|"
- "d1|d2|d3|d4|d5|d6|d7|d8|"
- "e1"
- ")+>\n"
- "]>\n"
- "<doc>\n"
- "<a1/>\n"
- "</doc>\n";
- int i;
- const int max_alloc_count = 50;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler flag not raised");
- }
- END_TEST
- START_TEST(test_alloc_realloc_group_choice) {
- const char *text = "<!DOCTYPE doc [\n"
- "<!ELEMENT doc ("
- "a1|a2|a3|a4|a5|a6|a7|a8|"
- "b1|b2|b3|b4|b5|b6|b7|b8|"
- "c1|c2|c3|c4|c5|c6|c7|c8|"
- "d1|d2|d3|d4|d5|d6|d7|d8|"
- "e1"
- ")+>\n"
- "]>\n"
- "<doc>\n"
- "<a1/>\n"
- "<b2 attr='foo'>This is a foo</b2>\n"
- "<c3></c3>\n"
- "</doc>\n";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
- fail("Element handler flag not raised");
- }
- END_TEST
- START_TEST(test_alloc_pi_in_epilog) {
- const char *text = "<doc></doc>\n"
- "<?pi in epilog?>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse completed despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags() != DUMMY_PI_HANDLER_FLAG)
- fail("Processing instruction handler not invoked");
- }
- END_TEST
- START_TEST(test_alloc_comment_in_epilog) {
- const char *text = "<doc></doc>\n"
- "<!-- comment in epilog -->";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetCommentHandler(g_parser, dummy_comment_handler);
- init_dummy_handlers();
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse completed despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- if (get_dummy_handler_flags() != DUMMY_COMMENT_HANDLER_FLAG)
- fail("Processing instruction handler not invoked");
- }
- END_TEST
- START_TEST(test_alloc_realloc_long_attribute_value) {
- const char *text
- = "<!DOCTYPE doc [<!ENTITY foo '"
- /* Each line is 64 characters */
- "This entity will be substituted as an attribute value, and is "
- "calculated to be exactly long enough that the terminating NUL "
- "that the library adds internally will trigger the string pool to"
- "grow. GHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>]>\n"
- "<doc a='&foo;'></doc>";
- int i;
- const int max_realloc_count = 10;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_attribute_whitespace) {
- const char *text = "<doc a=' '></doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- START_TEST(test_alloc_attribute_predefined_entity) {
- const char *text = "<doc a='&'></doc>";
- int i;
- const int max_alloc_count = 15;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test that a character reference at the end of a suitably long
- * default value for an attribute can trigger pool growth, and recovers
- * if the allocator fails on it.
- */
- START_TEST(test_alloc_long_attr_default_with_char_ref) {
- const char *text
- = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHI"
- "1'>]>\n"
- "<doc/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test that a long character reference substitution triggers a pool
- * expansion correctly for an attribute value.
- */
- START_TEST(test_alloc_long_attr_value) {
- const char *text
- = "<!DOCTYPE test [<!ENTITY foo '\n"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>]>\n"
- "<test a='&foo;'/>";
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing allocator");
- if (i == max_alloc_count)
- fail("Parse failed at maximum allocation count");
- }
- END_TEST
- /* Test that an error in a nested parameter entity substitution is
- * handled correctly. It seems unlikely that the code path being
- * exercised can be reached purely by carefully crafted XML, but an
- * allocation error in the right place will definitely do it.
- */
- START_TEST(test_alloc_nested_entities) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
- "<doc />";
- ExtFaults test_data
- = {"<!ENTITY % pe1 '"
- /* 64 characters per line */
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "'>\n"
- "<!ENTITY % pe2 '%pe1;'>\n"
- "<!ENTITY % pe3 '%pe2;'>",
- "Memory Fail not faulted", NULL, XML_ERROR_NO_MEMORY};
- /* Causes an allocation error in a nested storeEntityValue() */
- g_allocation_count = 12;
- XML_SetUserData(g_parser, &test_data);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
- expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
- "Entity allocation failure not noted");
- }
- END_TEST
- START_TEST(test_alloc_realloc_param_entity_newline) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc/>";
- char dtd_text[]
- = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
- /* 64 characters per line */
- "This default value is carefully crafted so that the carriage "
- "return right at the end of the entity string causes an internal "
- "string pool to have to grow. This allows us to test the alloc "
- "failure path from that point. OPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDE"
- "\">\n'>"
- "%pe;\n";
- int i;
- const int max_realloc_count = 5;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_realloc_ce_extends_pe) {
- const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
- "<doc/>";
- char dtd_text[]
- = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
- /* 64 characters per line */
- "This default value is carefully crafted so that the character "
- "entity at the end causes an internal string pool to have to "
- "grow. This allows us to test the allocation failure path from "
- "that point onwards. EFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
- "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGQ"
- "\">\n'>"
- "%pe;\n";
- int i;
- const int max_realloc_count = 5;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- XML_SetUserData(g_parser, dtd_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_realloc_attributes) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ATTLIST doc\n"
- " a1 (a|b|c) 'a'\n"
- " a2 (foo|bar) #IMPLIED\n"
- " a3 NMTOKEN #IMPLIED\n"
- " a4 NMTOKENS #IMPLIED\n"
- " a5 ID #IMPLIED\n"
- " a6 IDREF #IMPLIED\n"
- " a7 IDREFS #IMPLIED\n"
- " a8 ENTITY #IMPLIED\n"
- " a9 ENTITIES #IMPLIED\n"
- " a10 CDATA #IMPLIED\n"
- " >]>\n"
- "<doc>wombat</doc>\n";
- int i;
- const int max_realloc_count = 5;
- for (i = 0; i < max_realloc_count; i++) {
- g_reallocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parse succeeded despite failing reallocator");
- if (i == max_realloc_count)
- fail("Parse failed at maximum reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_long_doc_name) {
- const char *text =
- /* 64 characters per line */
- "<LongRootElementNameThatWillCauseTheNextAllocationToExpandTheStr"
- "ingPoolForTheDTDQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
- " a='1'/>";
- int i;
- const int max_alloc_count = 20;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing reallocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max reallocation count");
- }
- END_TEST
- START_TEST(test_alloc_long_base) {
- const char *text = "<!DOCTYPE doc [\n"
- " <!ENTITY e SYSTEM 'foo'>\n"
- "]>\n"
- "<doc>&e;</doc>";
- char entity_text[] = "Hello world";
- const XML_Char *base =
- /* 64 characters per line */
- /* clang-format off */
- XCS("LongBaseURI/that/will/overflow/an/internal/buffer/and/cause/it/t")
- XCS("o/have/to/grow/PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
- XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/");
- /* clang-format on */
- int i;
- const int max_alloc_count = 25;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (XML_SetBase(g_parser, base) == XML_STATUS_ERROR) {
- XML_ParserReset(g_parser, NULL);
- continue;
- }
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
- }
- END_TEST
- START_TEST(test_alloc_long_public_id) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY e PUBLIC '"
- /* 64 characters per line */
- "LongPublicIDThatShouldResultInAnInternalStringPoolGrowingAtASpec"
- "ificMomentKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "' 'bar'>\n"
- "]>\n"
- "<doc>&e;</doc>";
- char entity_text[] = "Hello world";
- int i;
- const int max_alloc_count = 40;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
- }
- END_TEST
- START_TEST(test_alloc_long_entity_value) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!ENTITY e1 '"
- /* 64 characters per line */
- "Long entity value that should provoke a string pool to grow whil"
- "e setting up to parse the external entity below. xyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "'>\n"
- " <!ENTITY e2 SYSTEM 'bar'>\n"
- "]>\n"
- "<doc>&e2;</doc>";
- char entity_text[] = "Hello world";
- int i;
- const int max_alloc_count = 40;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetUserData(g_parser, entity_text);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
- }
- END_TEST
- START_TEST(test_alloc_long_notation) {
- const char *text
- = "<!DOCTYPE doc [\n"
- " <!NOTATION note SYSTEM '"
- /* 64 characters per line */
- "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
- "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "'>\n"
- " <!ENTITY e1 SYSTEM 'foo' NDATA "
- /* 64 characters per line */
- "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
- "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
- ">\n"
- " <!ENTITY e2 SYSTEM 'bar'>\n"
- "]>\n"
- "<doc>&e2;</doc>";
- ExtOption options[]
- = {{XCS("foo"), "Entity Foo"}, {XCS("bar"), "Entity Bar"}, {NULL, NULL}};
- int i;
- const int max_alloc_count = 40;
- for (i = 0; i < max_alloc_count; i++) {
- g_allocation_count = i;
- XML_SetUserData(g_parser, options);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- break;
- /* See comment in test_alloc_parse_xdecl() */
- alloc_teardown();
- alloc_setup();
- }
- if (i == 0)
- fail("Parsing worked despite failing allocations");
- else if (i == max_alloc_count)
- fail("Parsing failed even at max allocation count");
- }
- END_TEST
- START_TEST(test_alloc_reset_after_external_entity_parser_create_fail) {
- const char *const text = "<!DOCTYPE doc SYSTEM 'foo'><doc/>";
- XML_SetExternalEntityRefHandler(
- g_parser, external_entity_parser_create_alloc_fail_handler);
- XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
- if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_ERROR)
- fail("Call to parse was expected to fail");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
- fail("Call to parse was expected to fail from the external entity handler");
- XML_ParserReset(g_parser, NULL);
- }
- END_TEST
- void
- make_alloc_test_case(Suite *s) {
- TCase *tc_alloc = tcase_create("allocation tests");
- suite_add_tcase(s, tc_alloc);
- tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
- tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
- tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
- tcase_add_test(tc_alloc, test_alloc_parse_pi);
- tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
- tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
- tcase_add_test(tc_alloc, test_alloc_parse_comment);
- tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_parameter_entity);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
- tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
- tcase_add_test(tc_alloc, test_alloc_set_base);
- tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_ext_entity_realloc_buffer);
- tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_subst_public_entity_value);
- tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
- tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_attribute_enum_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_notation);
- tcase_add_test(tc_alloc, test_alloc_public_notation);
- tcase_add_test(tc_alloc, test_alloc_system_notation);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
- tcase_add_test(tc_alloc, test_alloc_large_group);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
- tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
- tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_long_attribute_value);
- tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
- tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
- tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_attr_value);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
- tcase_add_test__ifdef_xml_dtd(tc_alloc,
- test_alloc_realloc_param_entity_newline);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
- tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
- tcase_add_test(tc_alloc, test_alloc_long_doc_name);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_base);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_public_id);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_entity_value);
- tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_notation);
- tcase_add_test__ifdef_xml_dtd(
- tc_alloc, test_alloc_reset_after_external_entity_parser_create_fail);
- }
|