1*bd8f1dc3Sbluhm /* Tests in the "allocation" test case for the Expat test suite
2*bd8f1dc3Sbluhm __ __ _
3*bd8f1dc3Sbluhm ___\ \/ /_ __ __ _| |_
4*bd8f1dc3Sbluhm / _ \\ /| '_ \ / _` | __|
5*bd8f1dc3Sbluhm | __// \| |_) | (_| | |_
6*bd8f1dc3Sbluhm \___/_/\_\ .__/ \__,_|\__|
7*bd8f1dc3Sbluhm |_| XML parser
8*bd8f1dc3Sbluhm
9*bd8f1dc3Sbluhm Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
10*bd8f1dc3Sbluhm Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
11*bd8f1dc3Sbluhm Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
12*bd8f1dc3Sbluhm Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
13*bd8f1dc3Sbluhm Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
14*bd8f1dc3Sbluhm Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
15*bd8f1dc3Sbluhm Copyright (c) 2017 Joe Orton <jorton@redhat.com>
16*bd8f1dc3Sbluhm Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
17*bd8f1dc3Sbluhm Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
18*bd8f1dc3Sbluhm Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
19*bd8f1dc3Sbluhm Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
20*bd8f1dc3Sbluhm Copyright (c) 2021 Donghee Na <donghee.na@python.org>
21*bd8f1dc3Sbluhm Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
22*bd8f1dc3Sbluhm Licensed under the MIT license:
23*bd8f1dc3Sbluhm
24*bd8f1dc3Sbluhm Permission is hereby granted, free of charge, to any person obtaining
25*bd8f1dc3Sbluhm a copy of this software and associated documentation files (the
26*bd8f1dc3Sbluhm "Software"), to deal in the Software without restriction, including
27*bd8f1dc3Sbluhm without limitation the rights to use, copy, modify, merge, publish,
28*bd8f1dc3Sbluhm distribute, sublicense, and/or sell copies of the Software, and to permit
29*bd8f1dc3Sbluhm persons to whom the Software is furnished to do so, subject to the
30*bd8f1dc3Sbluhm following conditions:
31*bd8f1dc3Sbluhm
32*bd8f1dc3Sbluhm The above copyright notice and this permission notice shall be included
33*bd8f1dc3Sbluhm in all copies or substantial portions of the Software.
34*bd8f1dc3Sbluhm
35*bd8f1dc3Sbluhm THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
36*bd8f1dc3Sbluhm EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
37*bd8f1dc3Sbluhm MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
38*bd8f1dc3Sbluhm NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
39*bd8f1dc3Sbluhm DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
40*bd8f1dc3Sbluhm OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
41*bd8f1dc3Sbluhm USE OR OTHER DEALINGS IN THE SOFTWARE.
42*bd8f1dc3Sbluhm */
43*bd8f1dc3Sbluhm
44*bd8f1dc3Sbluhm #if defined(NDEBUG)
45*bd8f1dc3Sbluhm # undef NDEBUG /* because test suite relies on assert(...) at the moment */
46*bd8f1dc3Sbluhm #endif
47*bd8f1dc3Sbluhm
48*bd8f1dc3Sbluhm #include <string.h>
49*bd8f1dc3Sbluhm #include <assert.h>
50*bd8f1dc3Sbluhm
51*bd8f1dc3Sbluhm #include "expat.h"
52*bd8f1dc3Sbluhm #include "common.h"
53*bd8f1dc3Sbluhm #include "minicheck.h"
54*bd8f1dc3Sbluhm #include "dummy.h"
55*bd8f1dc3Sbluhm #include "handlers.h"
56*bd8f1dc3Sbluhm #include "alloc_tests.h"
57*bd8f1dc3Sbluhm
58*bd8f1dc3Sbluhm static void
alloc_setup(void)59*bd8f1dc3Sbluhm alloc_setup(void) {
60*bd8f1dc3Sbluhm XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
61*bd8f1dc3Sbluhm
62*bd8f1dc3Sbluhm /* Ensure the parser creation will go through */
63*bd8f1dc3Sbluhm g_allocation_count = ALLOC_ALWAYS_SUCCEED;
64*bd8f1dc3Sbluhm g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
65*bd8f1dc3Sbluhm g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
66*bd8f1dc3Sbluhm if (g_parser == NULL)
67*bd8f1dc3Sbluhm fail("Parser not created");
68*bd8f1dc3Sbluhm }
69*bd8f1dc3Sbluhm
70*bd8f1dc3Sbluhm static void
alloc_teardown(void)71*bd8f1dc3Sbluhm alloc_teardown(void) {
72*bd8f1dc3Sbluhm basic_teardown();
73*bd8f1dc3Sbluhm }
74*bd8f1dc3Sbluhm
75*bd8f1dc3Sbluhm /* Test the effects of allocation failures on xml declaration processing */
START_TEST(test_alloc_parse_xdecl)76*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_xdecl) {
77*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
78*bd8f1dc3Sbluhm "<doc>Hello, world</doc>";
79*bd8f1dc3Sbluhm int i;
80*bd8f1dc3Sbluhm const int max_alloc_count = 15;
81*bd8f1dc3Sbluhm
82*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
83*bd8f1dc3Sbluhm g_allocation_count = i;
84*bd8f1dc3Sbluhm XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
85*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
86*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
87*bd8f1dc3Sbluhm break;
88*bd8f1dc3Sbluhm /* Resetting the parser is insufficient, because some memory
89*bd8f1dc3Sbluhm * allocations are cached within the parser. Instead we use
90*bd8f1dc3Sbluhm * the teardown and setup routines to ensure that we have the
91*bd8f1dc3Sbluhm * right sort of parser back in our hands.
92*bd8f1dc3Sbluhm */
93*bd8f1dc3Sbluhm alloc_teardown();
94*bd8f1dc3Sbluhm alloc_setup();
95*bd8f1dc3Sbluhm }
96*bd8f1dc3Sbluhm if (i == 0)
97*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
98*bd8f1dc3Sbluhm if (i == max_alloc_count)
99*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
100*bd8f1dc3Sbluhm }
101*bd8f1dc3Sbluhm END_TEST
102*bd8f1dc3Sbluhm
103*bd8f1dc3Sbluhm /* As above, but with an encoding big enough to cause storing the
104*bd8f1dc3Sbluhm * version information to expand the string pool being used.
105*bd8f1dc3Sbluhm */
START_TEST(test_alloc_parse_xdecl_2)106*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_xdecl_2) {
107*bd8f1dc3Sbluhm const char *text
108*bd8f1dc3Sbluhm = "<?xml version='1.0' encoding='"
109*bd8f1dc3Sbluhm /* Each line is 64 characters */
110*bd8f1dc3Sbluhm "ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
111*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
112*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
113*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
114*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
115*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
116*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
117*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
118*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
119*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
120*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
121*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
122*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
123*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
124*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
125*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
126*bd8f1dc3Sbluhm "'?>"
127*bd8f1dc3Sbluhm "<doc>Hello, world</doc>";
128*bd8f1dc3Sbluhm int i;
129*bd8f1dc3Sbluhm const int max_alloc_count = 20;
130*bd8f1dc3Sbluhm
131*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
132*bd8f1dc3Sbluhm g_allocation_count = i;
133*bd8f1dc3Sbluhm XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
134*bd8f1dc3Sbluhm XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
135*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
136*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
137*bd8f1dc3Sbluhm break;
138*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
139*bd8f1dc3Sbluhm alloc_teardown();
140*bd8f1dc3Sbluhm alloc_setup();
141*bd8f1dc3Sbluhm }
142*bd8f1dc3Sbluhm if (i == 0)
143*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
144*bd8f1dc3Sbluhm if (i == max_alloc_count)
145*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
146*bd8f1dc3Sbluhm }
147*bd8f1dc3Sbluhm END_TEST
148*bd8f1dc3Sbluhm
149*bd8f1dc3Sbluhm /* Test the effects of allocation failures on a straightforward parse */
START_TEST(test_alloc_parse_pi)150*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_pi) {
151*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
152*bd8f1dc3Sbluhm "<?pi unknown?>\n"
153*bd8f1dc3Sbluhm "<doc>"
154*bd8f1dc3Sbluhm "Hello, world"
155*bd8f1dc3Sbluhm "</doc>";
156*bd8f1dc3Sbluhm int i;
157*bd8f1dc3Sbluhm const int max_alloc_count = 15;
158*bd8f1dc3Sbluhm
159*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
160*bd8f1dc3Sbluhm g_allocation_count = i;
161*bd8f1dc3Sbluhm XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
162*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
163*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
164*bd8f1dc3Sbluhm break;
165*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
166*bd8f1dc3Sbluhm alloc_teardown();
167*bd8f1dc3Sbluhm alloc_setup();
168*bd8f1dc3Sbluhm }
169*bd8f1dc3Sbluhm if (i == 0)
170*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
171*bd8f1dc3Sbluhm if (i == max_alloc_count)
172*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
173*bd8f1dc3Sbluhm }
174*bd8f1dc3Sbluhm END_TEST
175*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_pi_2)176*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_pi_2) {
177*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
178*bd8f1dc3Sbluhm "<doc>"
179*bd8f1dc3Sbluhm "Hello, world"
180*bd8f1dc3Sbluhm "<?pi unknown?>\n"
181*bd8f1dc3Sbluhm "</doc>";
182*bd8f1dc3Sbluhm int i;
183*bd8f1dc3Sbluhm const int max_alloc_count = 15;
184*bd8f1dc3Sbluhm
185*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
186*bd8f1dc3Sbluhm g_allocation_count = i;
187*bd8f1dc3Sbluhm XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
188*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
189*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
190*bd8f1dc3Sbluhm break;
191*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
192*bd8f1dc3Sbluhm alloc_teardown();
193*bd8f1dc3Sbluhm alloc_setup();
194*bd8f1dc3Sbluhm }
195*bd8f1dc3Sbluhm if (i == 0)
196*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
197*bd8f1dc3Sbluhm if (i == max_alloc_count)
198*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
199*bd8f1dc3Sbluhm }
200*bd8f1dc3Sbluhm END_TEST
201*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_pi_3)202*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_pi_3) {
203*bd8f1dc3Sbluhm const char *text
204*bd8f1dc3Sbluhm = "<?"
205*bd8f1dc3Sbluhm /* 64 characters per line */
206*bd8f1dc3Sbluhm "This processing instruction should be long enough to ensure that"
207*bd8f1dc3Sbluhm "it triggers the growth of an internal string pool when the "
208*bd8f1dc3Sbluhm "allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
209*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
210*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
211*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
212*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
213*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
214*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
215*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
216*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
217*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
218*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
219*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
220*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
221*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
222*bd8f1dc3Sbluhm "Q?><doc/>";
223*bd8f1dc3Sbluhm int i;
224*bd8f1dc3Sbluhm const int max_alloc_count = 20;
225*bd8f1dc3Sbluhm
226*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
227*bd8f1dc3Sbluhm g_allocation_count = i;
228*bd8f1dc3Sbluhm XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
229*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
230*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
231*bd8f1dc3Sbluhm break;
232*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
233*bd8f1dc3Sbluhm alloc_teardown();
234*bd8f1dc3Sbluhm alloc_setup();
235*bd8f1dc3Sbluhm }
236*bd8f1dc3Sbluhm if (i == 0)
237*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
238*bd8f1dc3Sbluhm if (i == max_alloc_count)
239*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
240*bd8f1dc3Sbluhm }
241*bd8f1dc3Sbluhm END_TEST
242*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_comment)243*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_comment) {
244*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
245*bd8f1dc3Sbluhm "<!-- Test parsing this comment -->"
246*bd8f1dc3Sbluhm "<doc>Hi</doc>";
247*bd8f1dc3Sbluhm int i;
248*bd8f1dc3Sbluhm const int max_alloc_count = 15;
249*bd8f1dc3Sbluhm
250*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
251*bd8f1dc3Sbluhm g_allocation_count = i;
252*bd8f1dc3Sbluhm XML_SetCommentHandler(g_parser, dummy_comment_handler);
253*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
254*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
255*bd8f1dc3Sbluhm break;
256*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
257*bd8f1dc3Sbluhm alloc_teardown();
258*bd8f1dc3Sbluhm alloc_setup();
259*bd8f1dc3Sbluhm }
260*bd8f1dc3Sbluhm if (i == 0)
261*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
262*bd8f1dc3Sbluhm if (i == max_alloc_count)
263*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
264*bd8f1dc3Sbluhm }
265*bd8f1dc3Sbluhm END_TEST
266*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_comment_2)267*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_comment_2) {
268*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
269*bd8f1dc3Sbluhm "<doc>"
270*bd8f1dc3Sbluhm "Hello, world"
271*bd8f1dc3Sbluhm "<!-- Parse this comment too -->"
272*bd8f1dc3Sbluhm "</doc>";
273*bd8f1dc3Sbluhm int i;
274*bd8f1dc3Sbluhm const int max_alloc_count = 15;
275*bd8f1dc3Sbluhm
276*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
277*bd8f1dc3Sbluhm g_allocation_count = i;
278*bd8f1dc3Sbluhm XML_SetCommentHandler(g_parser, dummy_comment_handler);
279*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
280*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
281*bd8f1dc3Sbluhm break;
282*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
283*bd8f1dc3Sbluhm alloc_teardown();
284*bd8f1dc3Sbluhm alloc_setup();
285*bd8f1dc3Sbluhm }
286*bd8f1dc3Sbluhm if (i == 0)
287*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
288*bd8f1dc3Sbluhm if (i == max_alloc_count)
289*bd8f1dc3Sbluhm fail("Parse failed with max allocations");
290*bd8f1dc3Sbluhm }
291*bd8f1dc3Sbluhm END_TEST
292*bd8f1dc3Sbluhm
293*bd8f1dc3Sbluhm /* Test that external parser creation running out of memory is
294*bd8f1dc3Sbluhm * correctly reported. Based on the external entity test cases.
295*bd8f1dc3Sbluhm */
START_TEST(test_alloc_create_external_parser)296*bd8f1dc3Sbluhm START_TEST(test_alloc_create_external_parser) {
297*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
298*bd8f1dc3Sbluhm "<!DOCTYPE doc SYSTEM 'foo'>\n"
299*bd8f1dc3Sbluhm "<doc>&entity;</doc>";
300*bd8f1dc3Sbluhm char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
301*bd8f1dc3Sbluhm
302*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
303*bd8f1dc3Sbluhm XML_SetUserData(g_parser, foo_text);
304*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_duff_loader);
305*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
306*bd8f1dc3Sbluhm != XML_STATUS_ERROR) {
307*bd8f1dc3Sbluhm fail("External parser allocator returned success incorrectly");
308*bd8f1dc3Sbluhm }
309*bd8f1dc3Sbluhm }
310*bd8f1dc3Sbluhm END_TEST
311*bd8f1dc3Sbluhm
312*bd8f1dc3Sbluhm /* More external parser memory allocation testing */
START_TEST(test_alloc_run_external_parser)313*bd8f1dc3Sbluhm START_TEST(test_alloc_run_external_parser) {
314*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
315*bd8f1dc3Sbluhm "<!DOCTYPE doc SYSTEM 'foo'>\n"
316*bd8f1dc3Sbluhm "<doc>&entity;</doc>";
317*bd8f1dc3Sbluhm char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
318*bd8f1dc3Sbluhm unsigned int i;
319*bd8f1dc3Sbluhm const unsigned int max_alloc_count = 15;
320*bd8f1dc3Sbluhm
321*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
322*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
323*bd8f1dc3Sbluhm XML_SetUserData(g_parser, foo_text);
324*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
325*bd8f1dc3Sbluhm g_allocation_count = i;
326*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
327*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
328*bd8f1dc3Sbluhm break;
329*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
330*bd8f1dc3Sbluhm alloc_teardown();
331*bd8f1dc3Sbluhm alloc_setup();
332*bd8f1dc3Sbluhm }
333*bd8f1dc3Sbluhm if (i == 0)
334*bd8f1dc3Sbluhm fail("Parsing ignored failing allocator");
335*bd8f1dc3Sbluhm else if (i == max_alloc_count)
336*bd8f1dc3Sbluhm fail("Parsing failed with allocation count 10");
337*bd8f1dc3Sbluhm }
338*bd8f1dc3Sbluhm END_TEST
339*bd8f1dc3Sbluhm
340*bd8f1dc3Sbluhm /* Test that running out of memory in dtdCopy is correctly reported.
341*bd8f1dc3Sbluhm * Based on test_default_ns_from_ext_subset_and_ext_ge()
342*bd8f1dc3Sbluhm */
START_TEST(test_alloc_dtd_copy_default_atts)343*bd8f1dc3Sbluhm START_TEST(test_alloc_dtd_copy_default_atts) {
344*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0'?>\n"
345*bd8f1dc3Sbluhm "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
346*bd8f1dc3Sbluhm " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
347*bd8f1dc3Sbluhm "]>\n"
348*bd8f1dc3Sbluhm "<doc xmlns='http://example.org/ns1'>\n"
349*bd8f1dc3Sbluhm "&en;\n"
350*bd8f1dc3Sbluhm "</doc>";
351*bd8f1dc3Sbluhm int callno = 0;
352*bd8f1dc3Sbluhm
353*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
354*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler);
355*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &callno);
356*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
357*bd8f1dc3Sbluhm == XML_STATUS_ERROR)
358*bd8f1dc3Sbluhm xml_failure(g_parser);
359*bd8f1dc3Sbluhm }
360*bd8f1dc3Sbluhm END_TEST
361*bd8f1dc3Sbluhm
362*bd8f1dc3Sbluhm /* Test more external entity allocation failure paths */
START_TEST(test_alloc_external_entity)363*bd8f1dc3Sbluhm START_TEST(test_alloc_external_entity) {
364*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0'?>\n"
365*bd8f1dc3Sbluhm "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
366*bd8f1dc3Sbluhm " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
367*bd8f1dc3Sbluhm "]>\n"
368*bd8f1dc3Sbluhm "<doc xmlns='http://example.org/ns1'>\n"
369*bd8f1dc3Sbluhm "&en;\n"
370*bd8f1dc3Sbluhm "</doc>";
371*bd8f1dc3Sbluhm int i;
372*bd8f1dc3Sbluhm const int alloc_test_max_repeats = 50;
373*bd8f1dc3Sbluhm int callno = 0;
374*bd8f1dc3Sbluhm
375*bd8f1dc3Sbluhm for (i = 0; i < alloc_test_max_repeats; i++) {
376*bd8f1dc3Sbluhm g_allocation_count = -1;
377*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
378*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler_2);
379*bd8f1dc3Sbluhm callno = 0;
380*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &callno);
381*bd8f1dc3Sbluhm g_allocation_count = i;
382*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
383*bd8f1dc3Sbluhm == XML_STATUS_OK)
384*bd8f1dc3Sbluhm break;
385*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
386*bd8f1dc3Sbluhm alloc_teardown();
387*bd8f1dc3Sbluhm alloc_setup();
388*bd8f1dc3Sbluhm }
389*bd8f1dc3Sbluhm g_allocation_count = -1;
390*bd8f1dc3Sbluhm if (i == 0)
391*bd8f1dc3Sbluhm fail("External entity parsed despite duff allocator");
392*bd8f1dc3Sbluhm if (i == alloc_test_max_repeats)
393*bd8f1dc3Sbluhm fail("External entity not parsed at max allocation count");
394*bd8f1dc3Sbluhm }
395*bd8f1dc3Sbluhm END_TEST
396*bd8f1dc3Sbluhm
397*bd8f1dc3Sbluhm /* Test more allocation failure paths */
START_TEST(test_alloc_ext_entity_set_encoding)398*bd8f1dc3Sbluhm START_TEST(test_alloc_ext_entity_set_encoding) {
399*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
400*bd8f1dc3Sbluhm " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
401*bd8f1dc3Sbluhm "]>\n"
402*bd8f1dc3Sbluhm "<doc>&en;</doc>";
403*bd8f1dc3Sbluhm int i;
404*bd8f1dc3Sbluhm const int max_allocation_count = 30;
405*bd8f1dc3Sbluhm
406*bd8f1dc3Sbluhm for (i = 0; i < max_allocation_count; i++) {
407*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser,
408*bd8f1dc3Sbluhm external_entity_alloc_set_encoding);
409*bd8f1dc3Sbluhm g_allocation_count = i;
410*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
411*bd8f1dc3Sbluhm == XML_STATUS_OK)
412*bd8f1dc3Sbluhm break;
413*bd8f1dc3Sbluhm g_allocation_count = -1;
414*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
415*bd8f1dc3Sbluhm alloc_teardown();
416*bd8f1dc3Sbluhm alloc_setup();
417*bd8f1dc3Sbluhm }
418*bd8f1dc3Sbluhm if (i == 0)
419*bd8f1dc3Sbluhm fail("Encoding check succeeded despite failing allocator");
420*bd8f1dc3Sbluhm if (i == max_allocation_count)
421*bd8f1dc3Sbluhm fail("Encoding failed at max allocation count");
422*bd8f1dc3Sbluhm }
423*bd8f1dc3Sbluhm END_TEST
424*bd8f1dc3Sbluhm
425*bd8f1dc3Sbluhm /* Test the effects of allocation failure in internal entities.
426*bd8f1dc3Sbluhm * Based on test_unknown_encoding_internal_entity
427*bd8f1dc3Sbluhm */
START_TEST(test_alloc_internal_entity)428*bd8f1dc3Sbluhm START_TEST(test_alloc_internal_entity) {
429*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
430*bd8f1dc3Sbluhm "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
431*bd8f1dc3Sbluhm "<test a='&foo;'/>";
432*bd8f1dc3Sbluhm unsigned int i;
433*bd8f1dc3Sbluhm const unsigned int max_alloc_count = 20;
434*bd8f1dc3Sbluhm
435*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
436*bd8f1dc3Sbluhm g_allocation_count = i;
437*bd8f1dc3Sbluhm XML_SetUnknownEncodingHandler(g_parser, unknown_released_encoding_handler,
438*bd8f1dc3Sbluhm NULL);
439*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
440*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
441*bd8f1dc3Sbluhm break;
442*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
443*bd8f1dc3Sbluhm alloc_teardown();
444*bd8f1dc3Sbluhm alloc_setup();
445*bd8f1dc3Sbluhm }
446*bd8f1dc3Sbluhm if (i == 0)
447*bd8f1dc3Sbluhm fail("Internal entity worked despite failing allocations");
448*bd8f1dc3Sbluhm else if (i == max_alloc_count)
449*bd8f1dc3Sbluhm fail("Internal entity failed at max allocation count");
450*bd8f1dc3Sbluhm }
451*bd8f1dc3Sbluhm END_TEST
452*bd8f1dc3Sbluhm
453*bd8f1dc3Sbluhm /* Test the robustness against allocation failure of element handling
454*bd8f1dc3Sbluhm * Based on test_dtd_default_handling().
455*bd8f1dc3Sbluhm */
START_TEST(test_alloc_dtd_default_handling)456*bd8f1dc3Sbluhm START_TEST(test_alloc_dtd_default_handling) {
457*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
458*bd8f1dc3Sbluhm "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
459*bd8f1dc3Sbluhm "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
460*bd8f1dc3Sbluhm "<!ENTITY e1 SYSTEM 'http://example.org/e' NDATA n>\n"
461*bd8f1dc3Sbluhm "<!ELEMENT doc (#PCDATA)>\n"
462*bd8f1dc3Sbluhm "<!ATTLIST doc a CDATA #IMPLIED>\n"
463*bd8f1dc3Sbluhm "<?pi in dtd?>\n"
464*bd8f1dc3Sbluhm "<!--comment in dtd-->\n"
465*bd8f1dc3Sbluhm "]>\n"
466*bd8f1dc3Sbluhm "<doc><![CDATA[text in doc]]></doc>";
467*bd8f1dc3Sbluhm const XML_Char *expected = XCS("\n\n\n\n\n\n\n\n\n<doc>text in doc</doc>");
468*bd8f1dc3Sbluhm CharData storage;
469*bd8f1dc3Sbluhm int i;
470*bd8f1dc3Sbluhm const int max_alloc_count = 25;
471*bd8f1dc3Sbluhm
472*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
473*bd8f1dc3Sbluhm g_allocation_count = i;
474*bd8f1dc3Sbluhm init_dummy_handlers();
475*bd8f1dc3Sbluhm XML_SetDefaultHandler(g_parser, accumulate_characters);
476*bd8f1dc3Sbluhm XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
477*bd8f1dc3Sbluhm dummy_end_doctype_handler);
478*bd8f1dc3Sbluhm XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
479*bd8f1dc3Sbluhm XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
480*bd8f1dc3Sbluhm XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
481*bd8f1dc3Sbluhm XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
482*bd8f1dc3Sbluhm XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
483*bd8f1dc3Sbluhm XML_SetCommentHandler(g_parser, dummy_comment_handler);
484*bd8f1dc3Sbluhm XML_SetCdataSectionHandler(g_parser, dummy_start_cdata_handler,
485*bd8f1dc3Sbluhm dummy_end_cdata_handler);
486*bd8f1dc3Sbluhm XML_SetUnparsedEntityDeclHandler(g_parser,
487*bd8f1dc3Sbluhm dummy_unparsed_entity_decl_handler);
488*bd8f1dc3Sbluhm CharData_Init(&storage);
489*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &storage);
490*bd8f1dc3Sbluhm XML_SetCharacterDataHandler(g_parser, accumulate_characters);
491*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
492*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
493*bd8f1dc3Sbluhm break;
494*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
495*bd8f1dc3Sbluhm alloc_teardown();
496*bd8f1dc3Sbluhm alloc_setup();
497*bd8f1dc3Sbluhm }
498*bd8f1dc3Sbluhm if (i == 0)
499*bd8f1dc3Sbluhm fail("Default DTD parsed despite allocation failures");
500*bd8f1dc3Sbluhm if (i == max_alloc_count)
501*bd8f1dc3Sbluhm fail("Default DTD not parsed with maximum alloc count");
502*bd8f1dc3Sbluhm CharData_CheckXMLChars(&storage, expected);
503*bd8f1dc3Sbluhm if (get_dummy_handler_flags()
504*bd8f1dc3Sbluhm != (DUMMY_START_DOCTYPE_HANDLER_FLAG | DUMMY_END_DOCTYPE_HANDLER_FLAG
505*bd8f1dc3Sbluhm | DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG
506*bd8f1dc3Sbluhm | DUMMY_ELEMENT_DECL_HANDLER_FLAG | DUMMY_ATTLIST_DECL_HANDLER_FLAG
507*bd8f1dc3Sbluhm | DUMMY_COMMENT_HANDLER_FLAG | DUMMY_PI_HANDLER_FLAG
508*bd8f1dc3Sbluhm | DUMMY_START_CDATA_HANDLER_FLAG | DUMMY_END_CDATA_HANDLER_FLAG
509*bd8f1dc3Sbluhm | DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG))
510*bd8f1dc3Sbluhm fail("Not all handlers were called");
511*bd8f1dc3Sbluhm }
512*bd8f1dc3Sbluhm END_TEST
513*bd8f1dc3Sbluhm
514*bd8f1dc3Sbluhm /* Test robustness of XML_SetEncoding() with a failing allocator */
START_TEST(test_alloc_explicit_encoding)515*bd8f1dc3Sbluhm START_TEST(test_alloc_explicit_encoding) {
516*bd8f1dc3Sbluhm int i;
517*bd8f1dc3Sbluhm const int max_alloc_count = 5;
518*bd8f1dc3Sbluhm
519*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
520*bd8f1dc3Sbluhm g_allocation_count = i;
521*bd8f1dc3Sbluhm if (XML_SetEncoding(g_parser, XCS("us-ascii")) == XML_STATUS_OK)
522*bd8f1dc3Sbluhm break;
523*bd8f1dc3Sbluhm }
524*bd8f1dc3Sbluhm if (i == 0)
525*bd8f1dc3Sbluhm fail("Encoding set despite failing allocator");
526*bd8f1dc3Sbluhm else if (i == max_alloc_count)
527*bd8f1dc3Sbluhm fail("Encoding not set at max allocation count");
528*bd8f1dc3Sbluhm }
529*bd8f1dc3Sbluhm END_TEST
530*bd8f1dc3Sbluhm
531*bd8f1dc3Sbluhm /* Test robustness of XML_SetBase against a failing allocator */
START_TEST(test_alloc_set_base)532*bd8f1dc3Sbluhm START_TEST(test_alloc_set_base) {
533*bd8f1dc3Sbluhm const XML_Char *new_base = XCS("/local/file/name.xml");
534*bd8f1dc3Sbluhm int i;
535*bd8f1dc3Sbluhm const int max_alloc_count = 5;
536*bd8f1dc3Sbluhm
537*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
538*bd8f1dc3Sbluhm g_allocation_count = i;
539*bd8f1dc3Sbluhm if (XML_SetBase(g_parser, new_base) == XML_STATUS_OK)
540*bd8f1dc3Sbluhm break;
541*bd8f1dc3Sbluhm }
542*bd8f1dc3Sbluhm if (i == 0)
543*bd8f1dc3Sbluhm fail("Base set despite failing allocator");
544*bd8f1dc3Sbluhm else if (i == max_alloc_count)
545*bd8f1dc3Sbluhm fail("Base not set with max allocation count");
546*bd8f1dc3Sbluhm }
547*bd8f1dc3Sbluhm END_TEST
548*bd8f1dc3Sbluhm
549*bd8f1dc3Sbluhm /* Test buffer extension in the face of a duff reallocator */
START_TEST(test_alloc_realloc_buffer)550*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_buffer) {
551*bd8f1dc3Sbluhm const char *text = get_buffer_test_text;
552*bd8f1dc3Sbluhm void *buffer;
553*bd8f1dc3Sbluhm int i;
554*bd8f1dc3Sbluhm const int max_realloc_count = 10;
555*bd8f1dc3Sbluhm
556*bd8f1dc3Sbluhm /* Get a smallish buffer */
557*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
558*bd8f1dc3Sbluhm g_reallocation_count = i;
559*bd8f1dc3Sbluhm buffer = XML_GetBuffer(g_parser, 1536);
560*bd8f1dc3Sbluhm if (buffer == NULL)
561*bd8f1dc3Sbluhm fail("1.5K buffer reallocation failed");
562*bd8f1dc3Sbluhm assert(buffer != NULL);
563*bd8f1dc3Sbluhm memcpy(buffer, text, strlen(text));
564*bd8f1dc3Sbluhm if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
565*bd8f1dc3Sbluhm == XML_STATUS_OK)
566*bd8f1dc3Sbluhm break;
567*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
568*bd8f1dc3Sbluhm alloc_teardown();
569*bd8f1dc3Sbluhm alloc_setup();
570*bd8f1dc3Sbluhm }
571*bd8f1dc3Sbluhm g_reallocation_count = -1;
572*bd8f1dc3Sbluhm if (i == 0)
573*bd8f1dc3Sbluhm fail("Parse succeeded with no reallocation");
574*bd8f1dc3Sbluhm else if (i == max_realloc_count)
575*bd8f1dc3Sbluhm fail("Parse failed with max reallocation count");
576*bd8f1dc3Sbluhm }
577*bd8f1dc3Sbluhm END_TEST
578*bd8f1dc3Sbluhm
579*bd8f1dc3Sbluhm /* Same test for external entity parsers */
START_TEST(test_alloc_ext_entity_realloc_buffer)580*bd8f1dc3Sbluhm START_TEST(test_alloc_ext_entity_realloc_buffer) {
581*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
582*bd8f1dc3Sbluhm " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
583*bd8f1dc3Sbluhm "]>\n"
584*bd8f1dc3Sbluhm "<doc>&en;</doc>";
585*bd8f1dc3Sbluhm int i;
586*bd8f1dc3Sbluhm const int max_realloc_count = 10;
587*bd8f1dc3Sbluhm
588*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
589*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_reallocator);
590*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &i);
591*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
592*bd8f1dc3Sbluhm == XML_STATUS_OK)
593*bd8f1dc3Sbluhm break;
594*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
595*bd8f1dc3Sbluhm alloc_teardown();
596*bd8f1dc3Sbluhm alloc_setup();
597*bd8f1dc3Sbluhm }
598*bd8f1dc3Sbluhm if (i == 0)
599*bd8f1dc3Sbluhm fail("Succeeded with no reallocations");
600*bd8f1dc3Sbluhm if (i == max_realloc_count)
601*bd8f1dc3Sbluhm fail("Failed with max reallocations");
602*bd8f1dc3Sbluhm }
603*bd8f1dc3Sbluhm END_TEST
604*bd8f1dc3Sbluhm
605*bd8f1dc3Sbluhm /* Test elements with many attributes are handled correctly */
START_TEST(test_alloc_realloc_many_attributes)606*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_many_attributes) {
607*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
608*bd8f1dc3Sbluhm "<!ATTLIST doc za CDATA 'default'>\n"
609*bd8f1dc3Sbluhm "<!ATTLIST doc zb CDATA 'def2'>\n"
610*bd8f1dc3Sbluhm "<!ATTLIST doc zc CDATA 'def3'>\n"
611*bd8f1dc3Sbluhm "]>\n"
612*bd8f1dc3Sbluhm "<doc a='1'"
613*bd8f1dc3Sbluhm " b='2'"
614*bd8f1dc3Sbluhm " c='3'"
615*bd8f1dc3Sbluhm " d='4'"
616*bd8f1dc3Sbluhm " e='5'"
617*bd8f1dc3Sbluhm " f='6'"
618*bd8f1dc3Sbluhm " g='7'"
619*bd8f1dc3Sbluhm " h='8'"
620*bd8f1dc3Sbluhm " i='9'"
621*bd8f1dc3Sbluhm " j='10'"
622*bd8f1dc3Sbluhm " k='11'"
623*bd8f1dc3Sbluhm " l='12'"
624*bd8f1dc3Sbluhm " m='13'"
625*bd8f1dc3Sbluhm " n='14'"
626*bd8f1dc3Sbluhm " p='15'"
627*bd8f1dc3Sbluhm " q='16'"
628*bd8f1dc3Sbluhm " r='17'"
629*bd8f1dc3Sbluhm " s='18'>"
630*bd8f1dc3Sbluhm "</doc>";
631*bd8f1dc3Sbluhm int i;
632*bd8f1dc3Sbluhm const int max_realloc_count = 10;
633*bd8f1dc3Sbluhm
634*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
635*bd8f1dc3Sbluhm g_reallocation_count = i;
636*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
637*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
638*bd8f1dc3Sbluhm break;
639*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
640*bd8f1dc3Sbluhm alloc_teardown();
641*bd8f1dc3Sbluhm alloc_setup();
642*bd8f1dc3Sbluhm }
643*bd8f1dc3Sbluhm if (i == 0)
644*bd8f1dc3Sbluhm fail("Parse succeeded despite no reallocations");
645*bd8f1dc3Sbluhm if (i == max_realloc_count)
646*bd8f1dc3Sbluhm fail("Parse failed at max reallocations");
647*bd8f1dc3Sbluhm }
648*bd8f1dc3Sbluhm END_TEST
649*bd8f1dc3Sbluhm
650*bd8f1dc3Sbluhm /* Test handling of a public entity with failing allocator */
START_TEST(test_alloc_public_entity_value)651*bd8f1dc3Sbluhm START_TEST(test_alloc_public_entity_value) {
652*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
653*bd8f1dc3Sbluhm "<doc></doc>\n";
654*bd8f1dc3Sbluhm char dtd_text[]
655*bd8f1dc3Sbluhm = "<!ELEMENT doc EMPTY>\n"
656*bd8f1dc3Sbluhm "<!ENTITY % e1 PUBLIC 'foo' 'bar.ent'>\n"
657*bd8f1dc3Sbluhm "<!ENTITY % "
658*bd8f1dc3Sbluhm /* Each line is 64 characters */
659*bd8f1dc3Sbluhm "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
660*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
661*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
662*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
663*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
664*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
665*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
666*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
667*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
668*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
669*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
670*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
671*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
672*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
673*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
674*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
675*bd8f1dc3Sbluhm " '%e1;'>\n"
676*bd8f1dc3Sbluhm "%e1;\n";
677*bd8f1dc3Sbluhm int i;
678*bd8f1dc3Sbluhm const int max_alloc_count = 50;
679*bd8f1dc3Sbluhm
680*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
681*bd8f1dc3Sbluhm g_allocation_count = i;
682*bd8f1dc3Sbluhm init_dummy_handlers();
683*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
684*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
685*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
686*bd8f1dc3Sbluhm /* Provoke a particular code path */
687*bd8f1dc3Sbluhm XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
688*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
689*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
690*bd8f1dc3Sbluhm break;
691*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
692*bd8f1dc3Sbluhm alloc_teardown();
693*bd8f1dc3Sbluhm alloc_setup();
694*bd8f1dc3Sbluhm }
695*bd8f1dc3Sbluhm if (i == 0)
696*bd8f1dc3Sbluhm fail("Parsing worked despite failing allocation");
697*bd8f1dc3Sbluhm if (i == max_alloc_count)
698*bd8f1dc3Sbluhm fail("Parsing failed at max allocation count");
699*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_ENTITY_DECL_HANDLER_FLAG)
700*bd8f1dc3Sbluhm fail("Entity declaration handler not called");
701*bd8f1dc3Sbluhm }
702*bd8f1dc3Sbluhm END_TEST
703*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_subst_public_entity_value)704*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_subst_public_entity_value) {
705*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
706*bd8f1dc3Sbluhm "<doc></doc>\n";
707*bd8f1dc3Sbluhm char dtd_text[]
708*bd8f1dc3Sbluhm = "<!ELEMENT doc EMPTY>\n"
709*bd8f1dc3Sbluhm "<!ENTITY % "
710*bd8f1dc3Sbluhm /* Each line is 64 characters */
711*bd8f1dc3Sbluhm "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
712*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
713*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
714*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
715*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
716*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
717*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
718*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
719*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
720*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
721*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
722*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
723*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
724*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
725*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
726*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
727*bd8f1dc3Sbluhm " PUBLIC 'foo' 'bar.ent'>\n"
728*bd8f1dc3Sbluhm "%ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
729*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
730*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
731*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
732*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
733*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
734*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
735*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
736*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
737*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
738*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
739*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
740*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
741*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
742*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
743*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP;";
744*bd8f1dc3Sbluhm int i;
745*bd8f1dc3Sbluhm const int max_realloc_count = 10;
746*bd8f1dc3Sbluhm
747*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
748*bd8f1dc3Sbluhm g_reallocation_count = i;
749*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
750*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
751*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
752*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
753*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
754*bd8f1dc3Sbluhm break;
755*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
756*bd8f1dc3Sbluhm alloc_teardown();
757*bd8f1dc3Sbluhm alloc_setup();
758*bd8f1dc3Sbluhm }
759*bd8f1dc3Sbluhm if (i == 0)
760*bd8f1dc3Sbluhm fail("Parsing worked despite failing reallocation");
761*bd8f1dc3Sbluhm if (i == max_realloc_count)
762*bd8f1dc3Sbluhm fail("Parsing failed at max reallocation count");
763*bd8f1dc3Sbluhm }
764*bd8f1dc3Sbluhm END_TEST
765*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_public_doctype)766*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_public_doctype) {
767*bd8f1dc3Sbluhm const char *text
768*bd8f1dc3Sbluhm = "<?xml version='1.0' encoding='utf-8'?>\n"
769*bd8f1dc3Sbluhm "<!DOCTYPE doc PUBLIC '"
770*bd8f1dc3Sbluhm /* 64 characters per line */
771*bd8f1dc3Sbluhm "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
772*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
773*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
774*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
775*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
776*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
777*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
778*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
779*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
780*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
781*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
782*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
783*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
784*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
785*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
786*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
787*bd8f1dc3Sbluhm "' 'test'>\n"
788*bd8f1dc3Sbluhm "<doc></doc>";
789*bd8f1dc3Sbluhm int i;
790*bd8f1dc3Sbluhm const int max_alloc_count = 25;
791*bd8f1dc3Sbluhm
792*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
793*bd8f1dc3Sbluhm g_allocation_count = i;
794*bd8f1dc3Sbluhm init_dummy_handlers();
795*bd8f1dc3Sbluhm XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
796*bd8f1dc3Sbluhm dummy_end_doctype_decl_handler);
797*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
798*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
799*bd8f1dc3Sbluhm break;
800*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
801*bd8f1dc3Sbluhm alloc_teardown();
802*bd8f1dc3Sbluhm alloc_setup();
803*bd8f1dc3Sbluhm }
804*bd8f1dc3Sbluhm if (i == 0)
805*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
806*bd8f1dc3Sbluhm if (i == max_alloc_count)
807*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
808*bd8f1dc3Sbluhm if (get_dummy_handler_flags()
809*bd8f1dc3Sbluhm != (DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG
810*bd8f1dc3Sbluhm | DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG))
811*bd8f1dc3Sbluhm fail("Doctype handler functions not called");
812*bd8f1dc3Sbluhm }
813*bd8f1dc3Sbluhm END_TEST
814*bd8f1dc3Sbluhm
START_TEST(test_alloc_parse_public_doctype_long_name)815*bd8f1dc3Sbluhm START_TEST(test_alloc_parse_public_doctype_long_name) {
816*bd8f1dc3Sbluhm const char *text
817*bd8f1dc3Sbluhm = "<?xml version='1.0' encoding='utf-8'?>\n"
818*bd8f1dc3Sbluhm "<!DOCTYPE doc PUBLIC 'http://example.com/foo' '"
819*bd8f1dc3Sbluhm /* 64 characters per line */
820*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
821*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
822*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
823*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
824*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
825*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
826*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
827*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
828*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
829*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
830*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
831*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
832*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
833*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
834*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
835*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
836*bd8f1dc3Sbluhm "'>\n"
837*bd8f1dc3Sbluhm "<doc></doc>";
838*bd8f1dc3Sbluhm int i;
839*bd8f1dc3Sbluhm const int max_alloc_count = 25;
840*bd8f1dc3Sbluhm
841*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
842*bd8f1dc3Sbluhm g_allocation_count = i;
843*bd8f1dc3Sbluhm XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
844*bd8f1dc3Sbluhm dummy_end_doctype_decl_handler);
845*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
846*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
847*bd8f1dc3Sbluhm break;
848*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
849*bd8f1dc3Sbluhm alloc_teardown();
850*bd8f1dc3Sbluhm alloc_setup();
851*bd8f1dc3Sbluhm }
852*bd8f1dc3Sbluhm if (i == 0)
853*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
854*bd8f1dc3Sbluhm if (i == max_alloc_count)
855*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
856*bd8f1dc3Sbluhm }
857*bd8f1dc3Sbluhm END_TEST
858*bd8f1dc3Sbluhm
859*bd8f1dc3Sbluhm /* Test foreign DTD handling */
START_TEST(test_alloc_set_foreign_dtd)860*bd8f1dc3Sbluhm START_TEST(test_alloc_set_foreign_dtd) {
861*bd8f1dc3Sbluhm const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
862*bd8f1dc3Sbluhm "<doc>&entity;</doc>";
863*bd8f1dc3Sbluhm char text2[] = "<!ELEMENT doc (#PCDATA)*>";
864*bd8f1dc3Sbluhm int i;
865*bd8f1dc3Sbluhm const int max_alloc_count = 25;
866*bd8f1dc3Sbluhm
867*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
868*bd8f1dc3Sbluhm g_allocation_count = i;
869*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
870*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &text2);
871*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
872*bd8f1dc3Sbluhm if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
873*bd8f1dc3Sbluhm fail("Could not set foreign DTD");
874*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_TRUE)
875*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
876*bd8f1dc3Sbluhm break;
877*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
878*bd8f1dc3Sbluhm alloc_teardown();
879*bd8f1dc3Sbluhm alloc_setup();
880*bd8f1dc3Sbluhm }
881*bd8f1dc3Sbluhm if (i == 0)
882*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
883*bd8f1dc3Sbluhm if (i == max_alloc_count)
884*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
885*bd8f1dc3Sbluhm }
886*bd8f1dc3Sbluhm END_TEST
887*bd8f1dc3Sbluhm
888*bd8f1dc3Sbluhm /* Test based on ibm/valid/P32/ibm32v04.xml */
START_TEST(test_alloc_attribute_enum_value)889*bd8f1dc3Sbluhm START_TEST(test_alloc_attribute_enum_value) {
890*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' standalone='no'?>\n"
891*bd8f1dc3Sbluhm "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
892*bd8f1dc3Sbluhm "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
893*bd8f1dc3Sbluhm char dtd_text[] = "<!ELEMENT animal (#PCDATA|a)*>\n"
894*bd8f1dc3Sbluhm "<!ELEMENT a EMPTY>\n"
895*bd8f1dc3Sbluhm "<!ATTLIST animal xml:space (default|preserve) 'preserve'>";
896*bd8f1dc3Sbluhm int i;
897*bd8f1dc3Sbluhm const int max_alloc_count = 30;
898*bd8f1dc3Sbluhm
899*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
900*bd8f1dc3Sbluhm g_allocation_count = i;
901*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
902*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
903*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
904*bd8f1dc3Sbluhm /* An attribute list handler provokes a different code path */
905*bd8f1dc3Sbluhm XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
906*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
907*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
908*bd8f1dc3Sbluhm break;
909*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
910*bd8f1dc3Sbluhm alloc_teardown();
911*bd8f1dc3Sbluhm alloc_setup();
912*bd8f1dc3Sbluhm }
913*bd8f1dc3Sbluhm if (i == 0)
914*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
915*bd8f1dc3Sbluhm if (i == max_alloc_count)
916*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
917*bd8f1dc3Sbluhm }
918*bd8f1dc3Sbluhm END_TEST
919*bd8f1dc3Sbluhm
920*bd8f1dc3Sbluhm /* Test attribute enums sufficient to overflow the string pool */
START_TEST(test_alloc_realloc_attribute_enum_value)921*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_attribute_enum_value) {
922*bd8f1dc3Sbluhm const char *text = "<?xml version='1.0' standalone='no'?>\n"
923*bd8f1dc3Sbluhm "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
924*bd8f1dc3Sbluhm "<animal>This is a yellow tiger</animal>";
925*bd8f1dc3Sbluhm /* We wish to define a collection of attribute enums that will
926*bd8f1dc3Sbluhm * cause the string pool storing them to have to expand. This
927*bd8f1dc3Sbluhm * means more than 1024 bytes, including the parentheses and
928*bd8f1dc3Sbluhm * separator bars.
929*bd8f1dc3Sbluhm */
930*bd8f1dc3Sbluhm char dtd_text[]
931*bd8f1dc3Sbluhm = "<!ELEMENT animal (#PCDATA)*>\n"
932*bd8f1dc3Sbluhm "<!ATTLIST animal thing "
933*bd8f1dc3Sbluhm "(default"
934*bd8f1dc3Sbluhm /* Each line is 64 characters */
935*bd8f1dc3Sbluhm "|ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
936*bd8f1dc3Sbluhm "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
937*bd8f1dc3Sbluhm "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
938*bd8f1dc3Sbluhm "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
939*bd8f1dc3Sbluhm "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
940*bd8f1dc3Sbluhm "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
941*bd8f1dc3Sbluhm "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
942*bd8f1dc3Sbluhm "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
943*bd8f1dc3Sbluhm "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
944*bd8f1dc3Sbluhm "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
945*bd8f1dc3Sbluhm "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
946*bd8f1dc3Sbluhm "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
947*bd8f1dc3Sbluhm "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
948*bd8f1dc3Sbluhm "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
949*bd8f1dc3Sbluhm "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
950*bd8f1dc3Sbluhm "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO)"
951*bd8f1dc3Sbluhm " 'default'>";
952*bd8f1dc3Sbluhm int i;
953*bd8f1dc3Sbluhm const int max_realloc_count = 10;
954*bd8f1dc3Sbluhm
955*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
956*bd8f1dc3Sbluhm g_reallocation_count = i;
957*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
958*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
959*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
960*bd8f1dc3Sbluhm /* An attribute list handler provokes a different code path */
961*bd8f1dc3Sbluhm XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
962*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
963*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
964*bd8f1dc3Sbluhm break;
965*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
966*bd8f1dc3Sbluhm alloc_teardown();
967*bd8f1dc3Sbluhm alloc_setup();
968*bd8f1dc3Sbluhm }
969*bd8f1dc3Sbluhm if (i == 0)
970*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
971*bd8f1dc3Sbluhm if (i == max_realloc_count)
972*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
973*bd8f1dc3Sbluhm }
974*bd8f1dc3Sbluhm END_TEST
975*bd8f1dc3Sbluhm
976*bd8f1dc3Sbluhm /* Test attribute enums in a #IMPLIED attribute forcing pool growth */
START_TEST(test_alloc_realloc_implied_attribute)977*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_implied_attribute) {
978*bd8f1dc3Sbluhm /* Forcing this particular code path is a balancing act. The
979*bd8f1dc3Sbluhm * addition of the closing parenthesis and terminal NUL must be
980*bd8f1dc3Sbluhm * what pushes the string of enums over the 1024-byte limit,
981*bd8f1dc3Sbluhm * otherwise a different code path will pick up the realloc.
982*bd8f1dc3Sbluhm */
983*bd8f1dc3Sbluhm const char *text
984*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
985*bd8f1dc3Sbluhm "<!ELEMENT doc EMPTY>\n"
986*bd8f1dc3Sbluhm "<!ATTLIST doc a "
987*bd8f1dc3Sbluhm /* Each line is 64 characters */
988*bd8f1dc3Sbluhm "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
989*bd8f1dc3Sbluhm "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
990*bd8f1dc3Sbluhm "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
991*bd8f1dc3Sbluhm "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
992*bd8f1dc3Sbluhm "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
993*bd8f1dc3Sbluhm "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
994*bd8f1dc3Sbluhm "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
995*bd8f1dc3Sbluhm "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
996*bd8f1dc3Sbluhm "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
997*bd8f1dc3Sbluhm "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
998*bd8f1dc3Sbluhm "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
999*bd8f1dc3Sbluhm "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1000*bd8f1dc3Sbluhm "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1001*bd8f1dc3Sbluhm "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1002*bd8f1dc3Sbluhm "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1003*bd8f1dc3Sbluhm "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
1004*bd8f1dc3Sbluhm " #IMPLIED>\n"
1005*bd8f1dc3Sbluhm "]><doc/>";
1006*bd8f1dc3Sbluhm int i;
1007*bd8f1dc3Sbluhm const int max_realloc_count = 10;
1008*bd8f1dc3Sbluhm
1009*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1010*bd8f1dc3Sbluhm g_reallocation_count = i;
1011*bd8f1dc3Sbluhm XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
1012*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1013*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1014*bd8f1dc3Sbluhm break;
1015*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1016*bd8f1dc3Sbluhm alloc_teardown();
1017*bd8f1dc3Sbluhm alloc_setup();
1018*bd8f1dc3Sbluhm }
1019*bd8f1dc3Sbluhm if (i == 0)
1020*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1021*bd8f1dc3Sbluhm if (i == max_realloc_count)
1022*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1023*bd8f1dc3Sbluhm }
1024*bd8f1dc3Sbluhm END_TEST
1025*bd8f1dc3Sbluhm
1026*bd8f1dc3Sbluhm /* Test attribute enums in a defaulted attribute forcing pool growth */
START_TEST(test_alloc_realloc_default_attribute)1027*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_default_attribute) {
1028*bd8f1dc3Sbluhm /* Forcing this particular code path is a balancing act. The
1029*bd8f1dc3Sbluhm * addition of the closing parenthesis and terminal NUL must be
1030*bd8f1dc3Sbluhm * what pushes the string of enums over the 1024-byte limit,
1031*bd8f1dc3Sbluhm * otherwise a different code path will pick up the realloc.
1032*bd8f1dc3Sbluhm */
1033*bd8f1dc3Sbluhm const char *text
1034*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1035*bd8f1dc3Sbluhm "<!ELEMENT doc EMPTY>\n"
1036*bd8f1dc3Sbluhm "<!ATTLIST doc a "
1037*bd8f1dc3Sbluhm /* Each line is 64 characters */
1038*bd8f1dc3Sbluhm "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1039*bd8f1dc3Sbluhm "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1040*bd8f1dc3Sbluhm "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1041*bd8f1dc3Sbluhm "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1042*bd8f1dc3Sbluhm "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1043*bd8f1dc3Sbluhm "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1044*bd8f1dc3Sbluhm "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1045*bd8f1dc3Sbluhm "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1046*bd8f1dc3Sbluhm "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1047*bd8f1dc3Sbluhm "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1048*bd8f1dc3Sbluhm "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1049*bd8f1dc3Sbluhm "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1050*bd8f1dc3Sbluhm "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1051*bd8f1dc3Sbluhm "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1052*bd8f1dc3Sbluhm "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
1053*bd8f1dc3Sbluhm "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
1054*bd8f1dc3Sbluhm " 'ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO'"
1055*bd8f1dc3Sbluhm ">\n]><doc/>";
1056*bd8f1dc3Sbluhm int i;
1057*bd8f1dc3Sbluhm const int max_realloc_count = 10;
1058*bd8f1dc3Sbluhm
1059*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1060*bd8f1dc3Sbluhm g_reallocation_count = i;
1061*bd8f1dc3Sbluhm XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
1062*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1063*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1064*bd8f1dc3Sbluhm break;
1065*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1066*bd8f1dc3Sbluhm alloc_teardown();
1067*bd8f1dc3Sbluhm alloc_setup();
1068*bd8f1dc3Sbluhm }
1069*bd8f1dc3Sbluhm if (i == 0)
1070*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1071*bd8f1dc3Sbluhm if (i == max_realloc_count)
1072*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1073*bd8f1dc3Sbluhm }
1074*bd8f1dc3Sbluhm END_TEST
1075*bd8f1dc3Sbluhm
1076*bd8f1dc3Sbluhm /* Test long notation name with dodgy allocator */
START_TEST(test_alloc_notation)1077*bd8f1dc3Sbluhm START_TEST(test_alloc_notation) {
1078*bd8f1dc3Sbluhm const char *text
1079*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1080*bd8f1dc3Sbluhm "<!NOTATION "
1081*bd8f1dc3Sbluhm /* Each line is 64 characters */
1082*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1083*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1084*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1085*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1086*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1087*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1088*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1089*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1090*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1091*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1092*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1093*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1094*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1095*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1096*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1097*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1098*bd8f1dc3Sbluhm " SYSTEM 'http://example.org/n'>\n"
1099*bd8f1dc3Sbluhm "<!ENTITY e SYSTEM 'http://example.org/e' NDATA "
1100*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1101*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1102*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1103*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1104*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1105*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1106*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1107*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1108*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1109*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1110*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1111*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1112*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1113*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1114*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1115*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1116*bd8f1dc3Sbluhm ">\n"
1117*bd8f1dc3Sbluhm "<!ELEMENT doc EMPTY>\n"
1118*bd8f1dc3Sbluhm "]>\n<doc/>";
1119*bd8f1dc3Sbluhm int i;
1120*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1121*bd8f1dc3Sbluhm
1122*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1123*bd8f1dc3Sbluhm g_allocation_count = i;
1124*bd8f1dc3Sbluhm init_dummy_handlers();
1125*bd8f1dc3Sbluhm XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
1126*bd8f1dc3Sbluhm XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
1127*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1128*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1129*bd8f1dc3Sbluhm break;
1130*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1131*bd8f1dc3Sbluhm alloc_teardown();
1132*bd8f1dc3Sbluhm alloc_setup();
1133*bd8f1dc3Sbluhm }
1134*bd8f1dc3Sbluhm if (i == 0)
1135*bd8f1dc3Sbluhm fail("Parse succeeded despite allocation failures");
1136*bd8f1dc3Sbluhm if (i == max_alloc_count)
1137*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1138*bd8f1dc3Sbluhm if (get_dummy_handler_flags()
1139*bd8f1dc3Sbluhm != (DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG))
1140*bd8f1dc3Sbluhm fail("Entity declaration handler not called");
1141*bd8f1dc3Sbluhm }
1142*bd8f1dc3Sbluhm END_TEST
1143*bd8f1dc3Sbluhm
1144*bd8f1dc3Sbluhm /* Test public notation with dodgy allocator */
START_TEST(test_alloc_public_notation)1145*bd8f1dc3Sbluhm START_TEST(test_alloc_public_notation) {
1146*bd8f1dc3Sbluhm const char *text
1147*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1148*bd8f1dc3Sbluhm "<!NOTATION note PUBLIC '"
1149*bd8f1dc3Sbluhm /* 64 characters per line */
1150*bd8f1dc3Sbluhm "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
1151*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1152*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1153*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1154*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1155*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1156*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1157*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1158*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1159*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1160*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1161*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1162*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1163*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1164*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1165*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1166*bd8f1dc3Sbluhm "' 'foo'>\n"
1167*bd8f1dc3Sbluhm "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
1168*bd8f1dc3Sbluhm "<!ELEMENT doc EMPTY>\n"
1169*bd8f1dc3Sbluhm "]>\n<doc/>";
1170*bd8f1dc3Sbluhm int i;
1171*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1172*bd8f1dc3Sbluhm
1173*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1174*bd8f1dc3Sbluhm g_allocation_count = i;
1175*bd8f1dc3Sbluhm init_dummy_handlers();
1176*bd8f1dc3Sbluhm XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
1177*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1178*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1179*bd8f1dc3Sbluhm break;
1180*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1181*bd8f1dc3Sbluhm alloc_teardown();
1182*bd8f1dc3Sbluhm alloc_setup();
1183*bd8f1dc3Sbluhm }
1184*bd8f1dc3Sbluhm if (i == 0)
1185*bd8f1dc3Sbluhm fail("Parse succeeded despite allocation failures");
1186*bd8f1dc3Sbluhm if (i == max_alloc_count)
1187*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1188*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
1189*bd8f1dc3Sbluhm fail("Notation handler not called");
1190*bd8f1dc3Sbluhm }
1191*bd8f1dc3Sbluhm END_TEST
1192*bd8f1dc3Sbluhm
1193*bd8f1dc3Sbluhm /* Test public notation with dodgy allocator */
START_TEST(test_alloc_system_notation)1194*bd8f1dc3Sbluhm START_TEST(test_alloc_system_notation) {
1195*bd8f1dc3Sbluhm const char *text
1196*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1197*bd8f1dc3Sbluhm "<!NOTATION note SYSTEM '"
1198*bd8f1dc3Sbluhm /* 64 characters per line */
1199*bd8f1dc3Sbluhm "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
1200*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1201*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1202*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1203*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1204*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1205*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1206*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1207*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1208*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1209*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1210*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1211*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1212*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1213*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1214*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1215*bd8f1dc3Sbluhm "'>\n"
1216*bd8f1dc3Sbluhm "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
1217*bd8f1dc3Sbluhm "<!ELEMENT doc EMPTY>\n"
1218*bd8f1dc3Sbluhm "]>\n<doc/>";
1219*bd8f1dc3Sbluhm int i;
1220*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1221*bd8f1dc3Sbluhm
1222*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1223*bd8f1dc3Sbluhm g_allocation_count = i;
1224*bd8f1dc3Sbluhm init_dummy_handlers();
1225*bd8f1dc3Sbluhm XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
1226*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1227*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1228*bd8f1dc3Sbluhm break;
1229*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1230*bd8f1dc3Sbluhm alloc_teardown();
1231*bd8f1dc3Sbluhm alloc_setup();
1232*bd8f1dc3Sbluhm }
1233*bd8f1dc3Sbluhm if (i == 0)
1234*bd8f1dc3Sbluhm fail("Parse succeeded despite allocation failures");
1235*bd8f1dc3Sbluhm if (i == max_alloc_count)
1236*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1237*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_NOTATION_DECL_HANDLER_FLAG)
1238*bd8f1dc3Sbluhm fail("Notation handler not called");
1239*bd8f1dc3Sbluhm }
1240*bd8f1dc3Sbluhm END_TEST
1241*bd8f1dc3Sbluhm
START_TEST(test_alloc_nested_groups)1242*bd8f1dc3Sbluhm START_TEST(test_alloc_nested_groups) {
1243*bd8f1dc3Sbluhm const char *text
1244*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1245*bd8f1dc3Sbluhm "<!ELEMENT doc "
1246*bd8f1dc3Sbluhm /* Sixteen elements per line */
1247*bd8f1dc3Sbluhm "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
1248*bd8f1dc3Sbluhm "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
1249*bd8f1dc3Sbluhm "))))))))))))))))))))))))))))))))>\n"
1250*bd8f1dc3Sbluhm "<!ELEMENT e EMPTY>"
1251*bd8f1dc3Sbluhm "]>\n"
1252*bd8f1dc3Sbluhm "<doc><e/></doc>";
1253*bd8f1dc3Sbluhm CharData storage;
1254*bd8f1dc3Sbluhm int i;
1255*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1256*bd8f1dc3Sbluhm
1257*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1258*bd8f1dc3Sbluhm g_allocation_count = i;
1259*bd8f1dc3Sbluhm CharData_Init(&storage);
1260*bd8f1dc3Sbluhm XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
1261*bd8f1dc3Sbluhm XML_SetStartElementHandler(g_parser, record_element_start_handler);
1262*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &storage);
1263*bd8f1dc3Sbluhm init_dummy_handlers();
1264*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1265*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1266*bd8f1dc3Sbluhm break;
1267*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1268*bd8f1dc3Sbluhm alloc_teardown();
1269*bd8f1dc3Sbluhm alloc_setup();
1270*bd8f1dc3Sbluhm }
1271*bd8f1dc3Sbluhm
1272*bd8f1dc3Sbluhm if (i == 0)
1273*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1274*bd8f1dc3Sbluhm if (i == max_alloc_count)
1275*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1276*bd8f1dc3Sbluhm CharData_CheckXMLChars(&storage, XCS("doce"));
1277*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
1278*bd8f1dc3Sbluhm fail("Element handler not fired");
1279*bd8f1dc3Sbluhm }
1280*bd8f1dc3Sbluhm END_TEST
1281*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_nested_groups)1282*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_nested_groups) {
1283*bd8f1dc3Sbluhm const char *text
1284*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1285*bd8f1dc3Sbluhm "<!ELEMENT doc "
1286*bd8f1dc3Sbluhm /* Sixteen elements per line */
1287*bd8f1dc3Sbluhm "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
1288*bd8f1dc3Sbluhm "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
1289*bd8f1dc3Sbluhm "))))))))))))))))))))))))))))))))>\n"
1290*bd8f1dc3Sbluhm "<!ELEMENT e EMPTY>"
1291*bd8f1dc3Sbluhm "]>\n"
1292*bd8f1dc3Sbluhm "<doc><e/></doc>";
1293*bd8f1dc3Sbluhm CharData storage;
1294*bd8f1dc3Sbluhm int i;
1295*bd8f1dc3Sbluhm const int max_realloc_count = 10;
1296*bd8f1dc3Sbluhm
1297*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1298*bd8f1dc3Sbluhm g_reallocation_count = i;
1299*bd8f1dc3Sbluhm CharData_Init(&storage);
1300*bd8f1dc3Sbluhm XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
1301*bd8f1dc3Sbluhm XML_SetStartElementHandler(g_parser, record_element_start_handler);
1302*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &storage);
1303*bd8f1dc3Sbluhm init_dummy_handlers();
1304*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1305*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1306*bd8f1dc3Sbluhm break;
1307*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1308*bd8f1dc3Sbluhm alloc_teardown();
1309*bd8f1dc3Sbluhm alloc_setup();
1310*bd8f1dc3Sbluhm }
1311*bd8f1dc3Sbluhm
1312*bd8f1dc3Sbluhm if (i == 0)
1313*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1314*bd8f1dc3Sbluhm if (i == max_realloc_count)
1315*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1316*bd8f1dc3Sbluhm CharData_CheckXMLChars(&storage, XCS("doce"));
1317*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
1318*bd8f1dc3Sbluhm fail("Element handler not fired");
1319*bd8f1dc3Sbluhm }
1320*bd8f1dc3Sbluhm END_TEST
1321*bd8f1dc3Sbluhm
START_TEST(test_alloc_large_group)1322*bd8f1dc3Sbluhm START_TEST(test_alloc_large_group) {
1323*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
1324*bd8f1dc3Sbluhm "<!ELEMENT doc ("
1325*bd8f1dc3Sbluhm "a1|a2|a3|a4|a5|a6|a7|a8|"
1326*bd8f1dc3Sbluhm "b1|b2|b3|b4|b5|b6|b7|b8|"
1327*bd8f1dc3Sbluhm "c1|c2|c3|c4|c5|c6|c7|c8|"
1328*bd8f1dc3Sbluhm "d1|d2|d3|d4|d5|d6|d7|d8|"
1329*bd8f1dc3Sbluhm "e1"
1330*bd8f1dc3Sbluhm ")+>\n"
1331*bd8f1dc3Sbluhm "]>\n"
1332*bd8f1dc3Sbluhm "<doc>\n"
1333*bd8f1dc3Sbluhm "<a1/>\n"
1334*bd8f1dc3Sbluhm "</doc>\n";
1335*bd8f1dc3Sbluhm int i;
1336*bd8f1dc3Sbluhm const int max_alloc_count = 50;
1337*bd8f1dc3Sbluhm
1338*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1339*bd8f1dc3Sbluhm g_allocation_count = i;
1340*bd8f1dc3Sbluhm XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
1341*bd8f1dc3Sbluhm init_dummy_handlers();
1342*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1343*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1344*bd8f1dc3Sbluhm break;
1345*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1346*bd8f1dc3Sbluhm alloc_teardown();
1347*bd8f1dc3Sbluhm alloc_setup();
1348*bd8f1dc3Sbluhm }
1349*bd8f1dc3Sbluhm if (i == 0)
1350*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
1351*bd8f1dc3Sbluhm if (i == max_alloc_count)
1352*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1353*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
1354*bd8f1dc3Sbluhm fail("Element handler flag not raised");
1355*bd8f1dc3Sbluhm }
1356*bd8f1dc3Sbluhm END_TEST
1357*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_group_choice)1358*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_group_choice) {
1359*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
1360*bd8f1dc3Sbluhm "<!ELEMENT doc ("
1361*bd8f1dc3Sbluhm "a1|a2|a3|a4|a5|a6|a7|a8|"
1362*bd8f1dc3Sbluhm "b1|b2|b3|b4|b5|b6|b7|b8|"
1363*bd8f1dc3Sbluhm "c1|c2|c3|c4|c5|c6|c7|c8|"
1364*bd8f1dc3Sbluhm "d1|d2|d3|d4|d5|d6|d7|d8|"
1365*bd8f1dc3Sbluhm "e1"
1366*bd8f1dc3Sbluhm ")+>\n"
1367*bd8f1dc3Sbluhm "]>\n"
1368*bd8f1dc3Sbluhm "<doc>\n"
1369*bd8f1dc3Sbluhm "<a1/>\n"
1370*bd8f1dc3Sbluhm "<b2 attr='foo'>This is a foo</b2>\n"
1371*bd8f1dc3Sbluhm "<c3></c3>\n"
1372*bd8f1dc3Sbluhm "</doc>\n";
1373*bd8f1dc3Sbluhm int i;
1374*bd8f1dc3Sbluhm const int max_realloc_count = 10;
1375*bd8f1dc3Sbluhm
1376*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1377*bd8f1dc3Sbluhm g_reallocation_count = i;
1378*bd8f1dc3Sbluhm XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
1379*bd8f1dc3Sbluhm init_dummy_handlers();
1380*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1381*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1382*bd8f1dc3Sbluhm break;
1383*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1384*bd8f1dc3Sbluhm alloc_teardown();
1385*bd8f1dc3Sbluhm alloc_setup();
1386*bd8f1dc3Sbluhm }
1387*bd8f1dc3Sbluhm if (i == 0)
1388*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1389*bd8f1dc3Sbluhm if (i == max_realloc_count)
1390*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1391*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
1392*bd8f1dc3Sbluhm fail("Element handler flag not raised");
1393*bd8f1dc3Sbluhm }
1394*bd8f1dc3Sbluhm END_TEST
1395*bd8f1dc3Sbluhm
START_TEST(test_alloc_pi_in_epilog)1396*bd8f1dc3Sbluhm START_TEST(test_alloc_pi_in_epilog) {
1397*bd8f1dc3Sbluhm const char *text = "<doc></doc>\n"
1398*bd8f1dc3Sbluhm "<?pi in epilog?>";
1399*bd8f1dc3Sbluhm int i;
1400*bd8f1dc3Sbluhm const int max_alloc_count = 15;
1401*bd8f1dc3Sbluhm
1402*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1403*bd8f1dc3Sbluhm g_allocation_count = i;
1404*bd8f1dc3Sbluhm XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
1405*bd8f1dc3Sbluhm init_dummy_handlers();
1406*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1407*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1408*bd8f1dc3Sbluhm break;
1409*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1410*bd8f1dc3Sbluhm alloc_teardown();
1411*bd8f1dc3Sbluhm alloc_setup();
1412*bd8f1dc3Sbluhm }
1413*bd8f1dc3Sbluhm if (i == 0)
1414*bd8f1dc3Sbluhm fail("Parse completed despite failing allocator");
1415*bd8f1dc3Sbluhm if (i == max_alloc_count)
1416*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1417*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_PI_HANDLER_FLAG)
1418*bd8f1dc3Sbluhm fail("Processing instruction handler not invoked");
1419*bd8f1dc3Sbluhm }
1420*bd8f1dc3Sbluhm END_TEST
1421*bd8f1dc3Sbluhm
START_TEST(test_alloc_comment_in_epilog)1422*bd8f1dc3Sbluhm START_TEST(test_alloc_comment_in_epilog) {
1423*bd8f1dc3Sbluhm const char *text = "<doc></doc>\n"
1424*bd8f1dc3Sbluhm "<!-- comment in epilog -->";
1425*bd8f1dc3Sbluhm int i;
1426*bd8f1dc3Sbluhm const int max_alloc_count = 15;
1427*bd8f1dc3Sbluhm
1428*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1429*bd8f1dc3Sbluhm g_allocation_count = i;
1430*bd8f1dc3Sbluhm XML_SetCommentHandler(g_parser, dummy_comment_handler);
1431*bd8f1dc3Sbluhm init_dummy_handlers();
1432*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1433*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1434*bd8f1dc3Sbluhm break;
1435*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1436*bd8f1dc3Sbluhm alloc_teardown();
1437*bd8f1dc3Sbluhm alloc_setup();
1438*bd8f1dc3Sbluhm }
1439*bd8f1dc3Sbluhm if (i == 0)
1440*bd8f1dc3Sbluhm fail("Parse completed despite failing allocator");
1441*bd8f1dc3Sbluhm if (i == max_alloc_count)
1442*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1443*bd8f1dc3Sbluhm if (get_dummy_handler_flags() != DUMMY_COMMENT_HANDLER_FLAG)
1444*bd8f1dc3Sbluhm fail("Processing instruction handler not invoked");
1445*bd8f1dc3Sbluhm }
1446*bd8f1dc3Sbluhm END_TEST
1447*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_long_attribute_value)1448*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_long_attribute_value) {
1449*bd8f1dc3Sbluhm const char *text
1450*bd8f1dc3Sbluhm = "<!DOCTYPE doc [<!ENTITY foo '"
1451*bd8f1dc3Sbluhm /* Each line is 64 characters */
1452*bd8f1dc3Sbluhm "This entity will be substituted as an attribute value, and is "
1453*bd8f1dc3Sbluhm "calculated to be exactly long enough that the terminating NUL "
1454*bd8f1dc3Sbluhm "that the library adds internally will trigger the string pool to"
1455*bd8f1dc3Sbluhm "grow. GHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1456*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1457*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1458*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1459*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1460*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1461*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1462*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1463*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1464*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1465*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1466*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1467*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1468*bd8f1dc3Sbluhm "'>]>\n"
1469*bd8f1dc3Sbluhm "<doc a='&foo;'></doc>";
1470*bd8f1dc3Sbluhm int i;
1471*bd8f1dc3Sbluhm const int max_realloc_count = 10;
1472*bd8f1dc3Sbluhm
1473*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1474*bd8f1dc3Sbluhm g_reallocation_count = i;
1475*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1476*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1477*bd8f1dc3Sbluhm break;
1478*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1479*bd8f1dc3Sbluhm alloc_teardown();
1480*bd8f1dc3Sbluhm alloc_setup();
1481*bd8f1dc3Sbluhm }
1482*bd8f1dc3Sbluhm if (i == 0)
1483*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1484*bd8f1dc3Sbluhm if (i == max_realloc_count)
1485*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1486*bd8f1dc3Sbluhm }
1487*bd8f1dc3Sbluhm END_TEST
1488*bd8f1dc3Sbluhm
START_TEST(test_alloc_attribute_whitespace)1489*bd8f1dc3Sbluhm START_TEST(test_alloc_attribute_whitespace) {
1490*bd8f1dc3Sbluhm const char *text = "<doc a=' '></doc>";
1491*bd8f1dc3Sbluhm int i;
1492*bd8f1dc3Sbluhm const int max_alloc_count = 15;
1493*bd8f1dc3Sbluhm
1494*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1495*bd8f1dc3Sbluhm g_allocation_count = i;
1496*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1497*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1498*bd8f1dc3Sbluhm break;
1499*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1500*bd8f1dc3Sbluhm alloc_teardown();
1501*bd8f1dc3Sbluhm alloc_setup();
1502*bd8f1dc3Sbluhm }
1503*bd8f1dc3Sbluhm if (i == 0)
1504*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
1505*bd8f1dc3Sbluhm if (i == max_alloc_count)
1506*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1507*bd8f1dc3Sbluhm }
1508*bd8f1dc3Sbluhm END_TEST
1509*bd8f1dc3Sbluhm
START_TEST(test_alloc_attribute_predefined_entity)1510*bd8f1dc3Sbluhm START_TEST(test_alloc_attribute_predefined_entity) {
1511*bd8f1dc3Sbluhm const char *text = "<doc a='&'></doc>";
1512*bd8f1dc3Sbluhm int i;
1513*bd8f1dc3Sbluhm const int max_alloc_count = 15;
1514*bd8f1dc3Sbluhm
1515*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1516*bd8f1dc3Sbluhm g_allocation_count = i;
1517*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1518*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1519*bd8f1dc3Sbluhm break;
1520*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1521*bd8f1dc3Sbluhm alloc_teardown();
1522*bd8f1dc3Sbluhm alloc_setup();
1523*bd8f1dc3Sbluhm }
1524*bd8f1dc3Sbluhm if (i == 0)
1525*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
1526*bd8f1dc3Sbluhm if (i == max_alloc_count)
1527*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1528*bd8f1dc3Sbluhm }
1529*bd8f1dc3Sbluhm END_TEST
1530*bd8f1dc3Sbluhm
1531*bd8f1dc3Sbluhm /* Test that a character reference at the end of a suitably long
1532*bd8f1dc3Sbluhm * default value for an attribute can trigger pool growth, and recovers
1533*bd8f1dc3Sbluhm * if the allocator fails on it.
1534*bd8f1dc3Sbluhm */
START_TEST(test_alloc_long_attr_default_with_char_ref)1535*bd8f1dc3Sbluhm START_TEST(test_alloc_long_attr_default_with_char_ref) {
1536*bd8f1dc3Sbluhm const char *text
1537*bd8f1dc3Sbluhm = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '"
1538*bd8f1dc3Sbluhm /* 64 characters per line */
1539*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1540*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1541*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1542*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1543*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1544*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1545*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1546*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1547*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1548*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1549*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1550*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1551*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1552*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1553*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1554*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHI"
1555*bd8f1dc3Sbluhm "1'>]>\n"
1556*bd8f1dc3Sbluhm "<doc/>";
1557*bd8f1dc3Sbluhm int i;
1558*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1559*bd8f1dc3Sbluhm
1560*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1561*bd8f1dc3Sbluhm g_allocation_count = i;
1562*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1563*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1564*bd8f1dc3Sbluhm break;
1565*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1566*bd8f1dc3Sbluhm alloc_teardown();
1567*bd8f1dc3Sbluhm alloc_setup();
1568*bd8f1dc3Sbluhm }
1569*bd8f1dc3Sbluhm if (i == 0)
1570*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
1571*bd8f1dc3Sbluhm if (i == max_alloc_count)
1572*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1573*bd8f1dc3Sbluhm }
1574*bd8f1dc3Sbluhm END_TEST
1575*bd8f1dc3Sbluhm
1576*bd8f1dc3Sbluhm /* Test that a long character reference substitution triggers a pool
1577*bd8f1dc3Sbluhm * expansion correctly for an attribute value.
1578*bd8f1dc3Sbluhm */
START_TEST(test_alloc_long_attr_value)1579*bd8f1dc3Sbluhm START_TEST(test_alloc_long_attr_value) {
1580*bd8f1dc3Sbluhm const char *text
1581*bd8f1dc3Sbluhm = "<!DOCTYPE test [<!ENTITY foo '\n"
1582*bd8f1dc3Sbluhm /* 64 characters per line */
1583*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1584*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1585*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1586*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1587*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1588*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1589*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1590*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1591*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1592*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1593*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1594*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1595*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1596*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1597*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1598*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1599*bd8f1dc3Sbluhm "'>]>\n"
1600*bd8f1dc3Sbluhm "<test a='&foo;'/>";
1601*bd8f1dc3Sbluhm int i;
1602*bd8f1dc3Sbluhm const int max_alloc_count = 25;
1603*bd8f1dc3Sbluhm
1604*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1605*bd8f1dc3Sbluhm g_allocation_count = i;
1606*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1607*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1608*bd8f1dc3Sbluhm break;
1609*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1610*bd8f1dc3Sbluhm alloc_teardown();
1611*bd8f1dc3Sbluhm alloc_setup();
1612*bd8f1dc3Sbluhm }
1613*bd8f1dc3Sbluhm if (i == 0)
1614*bd8f1dc3Sbluhm fail("Parse succeeded despite failing allocator");
1615*bd8f1dc3Sbluhm if (i == max_alloc_count)
1616*bd8f1dc3Sbluhm fail("Parse failed at maximum allocation count");
1617*bd8f1dc3Sbluhm }
1618*bd8f1dc3Sbluhm END_TEST
1619*bd8f1dc3Sbluhm
1620*bd8f1dc3Sbluhm /* Test that an error in a nested parameter entity substitution is
1621*bd8f1dc3Sbluhm * handled correctly. It seems unlikely that the code path being
1622*bd8f1dc3Sbluhm * exercised can be reached purely by carefully crafted XML, but an
1623*bd8f1dc3Sbluhm * allocation error in the right place will definitely do it.
1624*bd8f1dc3Sbluhm */
START_TEST(test_alloc_nested_entities)1625*bd8f1dc3Sbluhm START_TEST(test_alloc_nested_entities) {
1626*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
1627*bd8f1dc3Sbluhm "<doc />";
1628*bd8f1dc3Sbluhm ExtFaults test_data
1629*bd8f1dc3Sbluhm = {"<!ENTITY % pe1 '"
1630*bd8f1dc3Sbluhm /* 64 characters per line */
1631*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1632*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1633*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1634*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1635*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1636*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1637*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1638*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1639*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1640*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1641*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1642*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1643*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1644*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1645*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1646*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1647*bd8f1dc3Sbluhm "'>\n"
1648*bd8f1dc3Sbluhm "<!ENTITY % pe2 '%pe1;'>\n"
1649*bd8f1dc3Sbluhm "<!ENTITY % pe3 '%pe2;'>",
1650*bd8f1dc3Sbluhm "Memory Fail not faulted", NULL, XML_ERROR_NO_MEMORY};
1651*bd8f1dc3Sbluhm
1652*bd8f1dc3Sbluhm /* Causes an allocation error in a nested storeEntityValue() */
1653*bd8f1dc3Sbluhm g_allocation_count = 12;
1654*bd8f1dc3Sbluhm XML_SetUserData(g_parser, &test_data);
1655*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1656*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
1657*bd8f1dc3Sbluhm expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
1658*bd8f1dc3Sbluhm "Entity allocation failure not noted");
1659*bd8f1dc3Sbluhm }
1660*bd8f1dc3Sbluhm END_TEST
1661*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_param_entity_newline)1662*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_param_entity_newline) {
1663*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
1664*bd8f1dc3Sbluhm "<doc/>";
1665*bd8f1dc3Sbluhm char dtd_text[]
1666*bd8f1dc3Sbluhm = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
1667*bd8f1dc3Sbluhm /* 64 characters per line */
1668*bd8f1dc3Sbluhm "This default value is carefully crafted so that the carriage "
1669*bd8f1dc3Sbluhm "return right at the end of the entity string causes an internal "
1670*bd8f1dc3Sbluhm "string pool to have to grow. This allows us to test the alloc "
1671*bd8f1dc3Sbluhm "failure path from that point. OPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1672*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1673*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1674*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1675*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1676*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1677*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1678*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1679*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1680*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1681*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1682*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1683*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDE"
1684*bd8f1dc3Sbluhm "\">\n'>"
1685*bd8f1dc3Sbluhm "%pe;\n";
1686*bd8f1dc3Sbluhm int i;
1687*bd8f1dc3Sbluhm const int max_realloc_count = 5;
1688*bd8f1dc3Sbluhm
1689*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1690*bd8f1dc3Sbluhm g_reallocation_count = i;
1691*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
1692*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1693*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
1694*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1695*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1696*bd8f1dc3Sbluhm break;
1697*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1698*bd8f1dc3Sbluhm alloc_teardown();
1699*bd8f1dc3Sbluhm alloc_setup();
1700*bd8f1dc3Sbluhm }
1701*bd8f1dc3Sbluhm if (i == 0)
1702*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1703*bd8f1dc3Sbluhm if (i == max_realloc_count)
1704*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1705*bd8f1dc3Sbluhm }
1706*bd8f1dc3Sbluhm END_TEST
1707*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_ce_extends_pe)1708*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_ce_extends_pe) {
1709*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
1710*bd8f1dc3Sbluhm "<doc/>";
1711*bd8f1dc3Sbluhm char dtd_text[]
1712*bd8f1dc3Sbluhm = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
1713*bd8f1dc3Sbluhm /* 64 characters per line */
1714*bd8f1dc3Sbluhm "This default value is carefully crafted so that the character "
1715*bd8f1dc3Sbluhm "entity at the end causes an internal string pool to have to "
1716*bd8f1dc3Sbluhm "grow. This allows us to test the allocation failure path from "
1717*bd8f1dc3Sbluhm "that point onwards. EFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1718*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1719*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1720*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1721*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1722*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1723*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1724*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1725*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1726*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1727*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1728*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1729*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGQ"
1730*bd8f1dc3Sbluhm "\">\n'>"
1731*bd8f1dc3Sbluhm "%pe;\n";
1732*bd8f1dc3Sbluhm int i;
1733*bd8f1dc3Sbluhm const int max_realloc_count = 5;
1734*bd8f1dc3Sbluhm
1735*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1736*bd8f1dc3Sbluhm g_reallocation_count = i;
1737*bd8f1dc3Sbluhm XML_SetUserData(g_parser, dtd_text);
1738*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1739*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
1740*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1741*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1742*bd8f1dc3Sbluhm break;
1743*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1744*bd8f1dc3Sbluhm alloc_teardown();
1745*bd8f1dc3Sbluhm alloc_setup();
1746*bd8f1dc3Sbluhm }
1747*bd8f1dc3Sbluhm if (i == 0)
1748*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1749*bd8f1dc3Sbluhm if (i == max_realloc_count)
1750*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1751*bd8f1dc3Sbluhm }
1752*bd8f1dc3Sbluhm END_TEST
1753*bd8f1dc3Sbluhm
START_TEST(test_alloc_realloc_attributes)1754*bd8f1dc3Sbluhm START_TEST(test_alloc_realloc_attributes) {
1755*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
1756*bd8f1dc3Sbluhm " <!ATTLIST doc\n"
1757*bd8f1dc3Sbluhm " a1 (a|b|c) 'a'\n"
1758*bd8f1dc3Sbluhm " a2 (foo|bar) #IMPLIED\n"
1759*bd8f1dc3Sbluhm " a3 NMTOKEN #IMPLIED\n"
1760*bd8f1dc3Sbluhm " a4 NMTOKENS #IMPLIED\n"
1761*bd8f1dc3Sbluhm " a5 ID #IMPLIED\n"
1762*bd8f1dc3Sbluhm " a6 IDREF #IMPLIED\n"
1763*bd8f1dc3Sbluhm " a7 IDREFS #IMPLIED\n"
1764*bd8f1dc3Sbluhm " a8 ENTITY #IMPLIED\n"
1765*bd8f1dc3Sbluhm " a9 ENTITIES #IMPLIED\n"
1766*bd8f1dc3Sbluhm " a10 CDATA #IMPLIED\n"
1767*bd8f1dc3Sbluhm " >]>\n"
1768*bd8f1dc3Sbluhm "<doc>wombat</doc>\n";
1769*bd8f1dc3Sbluhm int i;
1770*bd8f1dc3Sbluhm const int max_realloc_count = 5;
1771*bd8f1dc3Sbluhm
1772*bd8f1dc3Sbluhm for (i = 0; i < max_realloc_count; i++) {
1773*bd8f1dc3Sbluhm g_reallocation_count = i;
1774*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1775*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1776*bd8f1dc3Sbluhm break;
1777*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1778*bd8f1dc3Sbluhm alloc_teardown();
1779*bd8f1dc3Sbluhm alloc_setup();
1780*bd8f1dc3Sbluhm }
1781*bd8f1dc3Sbluhm
1782*bd8f1dc3Sbluhm if (i == 0)
1783*bd8f1dc3Sbluhm fail("Parse succeeded despite failing reallocator");
1784*bd8f1dc3Sbluhm if (i == max_realloc_count)
1785*bd8f1dc3Sbluhm fail("Parse failed at maximum reallocation count");
1786*bd8f1dc3Sbluhm }
1787*bd8f1dc3Sbluhm END_TEST
1788*bd8f1dc3Sbluhm
START_TEST(test_alloc_long_doc_name)1789*bd8f1dc3Sbluhm START_TEST(test_alloc_long_doc_name) {
1790*bd8f1dc3Sbluhm const char *text =
1791*bd8f1dc3Sbluhm /* 64 characters per line */
1792*bd8f1dc3Sbluhm "<LongRootElementNameThatWillCauseTheNextAllocationToExpandTheStr"
1793*bd8f1dc3Sbluhm "ingPoolForTheDTDQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1794*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1795*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1796*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1797*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1798*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1799*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1800*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1801*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1802*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1803*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1804*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1805*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1806*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1807*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
1808*bd8f1dc3Sbluhm " a='1'/>";
1809*bd8f1dc3Sbluhm int i;
1810*bd8f1dc3Sbluhm const int max_alloc_count = 20;
1811*bd8f1dc3Sbluhm
1812*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1813*bd8f1dc3Sbluhm g_allocation_count = i;
1814*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1815*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1816*bd8f1dc3Sbluhm break;
1817*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1818*bd8f1dc3Sbluhm alloc_teardown();
1819*bd8f1dc3Sbluhm alloc_setup();
1820*bd8f1dc3Sbluhm }
1821*bd8f1dc3Sbluhm if (i == 0)
1822*bd8f1dc3Sbluhm fail("Parsing worked despite failing reallocations");
1823*bd8f1dc3Sbluhm else if (i == max_alloc_count)
1824*bd8f1dc3Sbluhm fail("Parsing failed even at max reallocation count");
1825*bd8f1dc3Sbluhm }
1826*bd8f1dc3Sbluhm END_TEST
1827*bd8f1dc3Sbluhm
START_TEST(test_alloc_long_base)1828*bd8f1dc3Sbluhm START_TEST(test_alloc_long_base) {
1829*bd8f1dc3Sbluhm const char *text = "<!DOCTYPE doc [\n"
1830*bd8f1dc3Sbluhm " <!ENTITY e SYSTEM 'foo'>\n"
1831*bd8f1dc3Sbluhm "]>\n"
1832*bd8f1dc3Sbluhm "<doc>&e;</doc>";
1833*bd8f1dc3Sbluhm char entity_text[] = "Hello world";
1834*bd8f1dc3Sbluhm const XML_Char *base =
1835*bd8f1dc3Sbluhm /* 64 characters per line */
1836*bd8f1dc3Sbluhm /* clang-format off */
1837*bd8f1dc3Sbluhm XCS("LongBaseURI/that/will/overflow/an/internal/buffer/and/cause/it/t")
1838*bd8f1dc3Sbluhm XCS("o/have/to/grow/PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1839*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1840*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1841*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1842*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1843*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1844*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1845*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1846*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1847*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1848*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1849*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1850*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1851*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
1852*bd8f1dc3Sbluhm XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/");
1853*bd8f1dc3Sbluhm /* clang-format on */
1854*bd8f1dc3Sbluhm int i;
1855*bd8f1dc3Sbluhm const int max_alloc_count = 25;
1856*bd8f1dc3Sbluhm
1857*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1858*bd8f1dc3Sbluhm g_allocation_count = i;
1859*bd8f1dc3Sbluhm XML_SetUserData(g_parser, entity_text);
1860*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1861*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
1862*bd8f1dc3Sbluhm if (XML_SetBase(g_parser, base) == XML_STATUS_ERROR) {
1863*bd8f1dc3Sbluhm XML_ParserReset(g_parser, NULL);
1864*bd8f1dc3Sbluhm continue;
1865*bd8f1dc3Sbluhm }
1866*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1867*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1868*bd8f1dc3Sbluhm break;
1869*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1870*bd8f1dc3Sbluhm alloc_teardown();
1871*bd8f1dc3Sbluhm alloc_setup();
1872*bd8f1dc3Sbluhm }
1873*bd8f1dc3Sbluhm if (i == 0)
1874*bd8f1dc3Sbluhm fail("Parsing worked despite failing allocations");
1875*bd8f1dc3Sbluhm else if (i == max_alloc_count)
1876*bd8f1dc3Sbluhm fail("Parsing failed even at max allocation count");
1877*bd8f1dc3Sbluhm }
1878*bd8f1dc3Sbluhm END_TEST
1879*bd8f1dc3Sbluhm
START_TEST(test_alloc_long_public_id)1880*bd8f1dc3Sbluhm START_TEST(test_alloc_long_public_id) {
1881*bd8f1dc3Sbluhm const char *text
1882*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1883*bd8f1dc3Sbluhm " <!ENTITY e PUBLIC '"
1884*bd8f1dc3Sbluhm /* 64 characters per line */
1885*bd8f1dc3Sbluhm "LongPublicIDThatShouldResultInAnInternalStringPoolGrowingAtASpec"
1886*bd8f1dc3Sbluhm "ificMomentKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1887*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1888*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1889*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1890*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1891*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1892*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1893*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1894*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1895*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1896*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1897*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1898*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1899*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1900*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1901*bd8f1dc3Sbluhm "' 'bar'>\n"
1902*bd8f1dc3Sbluhm "]>\n"
1903*bd8f1dc3Sbluhm "<doc>&e;</doc>";
1904*bd8f1dc3Sbluhm char entity_text[] = "Hello world";
1905*bd8f1dc3Sbluhm int i;
1906*bd8f1dc3Sbluhm const int max_alloc_count = 40;
1907*bd8f1dc3Sbluhm
1908*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1909*bd8f1dc3Sbluhm g_allocation_count = i;
1910*bd8f1dc3Sbluhm XML_SetUserData(g_parser, entity_text);
1911*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1912*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
1913*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1914*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1915*bd8f1dc3Sbluhm break;
1916*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1917*bd8f1dc3Sbluhm alloc_teardown();
1918*bd8f1dc3Sbluhm alloc_setup();
1919*bd8f1dc3Sbluhm }
1920*bd8f1dc3Sbluhm if (i == 0)
1921*bd8f1dc3Sbluhm fail("Parsing worked despite failing allocations");
1922*bd8f1dc3Sbluhm else if (i == max_alloc_count)
1923*bd8f1dc3Sbluhm fail("Parsing failed even at max allocation count");
1924*bd8f1dc3Sbluhm }
1925*bd8f1dc3Sbluhm END_TEST
1926*bd8f1dc3Sbluhm
START_TEST(test_alloc_long_entity_value)1927*bd8f1dc3Sbluhm START_TEST(test_alloc_long_entity_value) {
1928*bd8f1dc3Sbluhm const char *text
1929*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1930*bd8f1dc3Sbluhm " <!ENTITY e1 '"
1931*bd8f1dc3Sbluhm /* 64 characters per line */
1932*bd8f1dc3Sbluhm "Long entity value that should provoke a string pool to grow whil"
1933*bd8f1dc3Sbluhm "e setting up to parse the external entity below. xyz0123456789AB"
1934*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1935*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1936*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1937*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1938*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1939*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1940*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1941*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1942*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1943*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1944*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1945*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1946*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1947*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1948*bd8f1dc3Sbluhm "'>\n"
1949*bd8f1dc3Sbluhm " <!ENTITY e2 SYSTEM 'bar'>\n"
1950*bd8f1dc3Sbluhm "]>\n"
1951*bd8f1dc3Sbluhm "<doc>&e2;</doc>";
1952*bd8f1dc3Sbluhm char entity_text[] = "Hello world";
1953*bd8f1dc3Sbluhm int i;
1954*bd8f1dc3Sbluhm const int max_alloc_count = 40;
1955*bd8f1dc3Sbluhm
1956*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
1957*bd8f1dc3Sbluhm g_allocation_count = i;
1958*bd8f1dc3Sbluhm XML_SetUserData(g_parser, entity_text);
1959*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1960*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
1961*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1962*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
1963*bd8f1dc3Sbluhm break;
1964*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
1965*bd8f1dc3Sbluhm alloc_teardown();
1966*bd8f1dc3Sbluhm alloc_setup();
1967*bd8f1dc3Sbluhm }
1968*bd8f1dc3Sbluhm if (i == 0)
1969*bd8f1dc3Sbluhm fail("Parsing worked despite failing allocations");
1970*bd8f1dc3Sbluhm else if (i == max_alloc_count)
1971*bd8f1dc3Sbluhm fail("Parsing failed even at max allocation count");
1972*bd8f1dc3Sbluhm }
1973*bd8f1dc3Sbluhm END_TEST
1974*bd8f1dc3Sbluhm
START_TEST(test_alloc_long_notation)1975*bd8f1dc3Sbluhm START_TEST(test_alloc_long_notation) {
1976*bd8f1dc3Sbluhm const char *text
1977*bd8f1dc3Sbluhm = "<!DOCTYPE doc [\n"
1978*bd8f1dc3Sbluhm " <!NOTATION note SYSTEM '"
1979*bd8f1dc3Sbluhm /* 64 characters per line */
1980*bd8f1dc3Sbluhm "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
1981*bd8f1dc3Sbluhm "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1982*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1983*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1984*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1985*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1986*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1987*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1988*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1989*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1990*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1991*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1992*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1993*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1994*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1995*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
1996*bd8f1dc3Sbluhm "'>\n"
1997*bd8f1dc3Sbluhm " <!ENTITY e1 SYSTEM 'foo' NDATA "
1998*bd8f1dc3Sbluhm /* 64 characters per line */
1999*bd8f1dc3Sbluhm "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
2000*bd8f1dc3Sbluhm "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2001*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2002*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2003*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2004*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2005*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2006*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2007*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2008*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2009*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2010*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2011*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2012*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2013*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2014*bd8f1dc3Sbluhm "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
2015*bd8f1dc3Sbluhm ">\n"
2016*bd8f1dc3Sbluhm " <!ENTITY e2 SYSTEM 'bar'>\n"
2017*bd8f1dc3Sbluhm "]>\n"
2018*bd8f1dc3Sbluhm "<doc>&e2;</doc>";
2019*bd8f1dc3Sbluhm ExtOption options[]
2020*bd8f1dc3Sbluhm = {{XCS("foo"), "Entity Foo"}, {XCS("bar"), "Entity Bar"}, {NULL, NULL}};
2021*bd8f1dc3Sbluhm int i;
2022*bd8f1dc3Sbluhm const int max_alloc_count = 40;
2023*bd8f1dc3Sbluhm
2024*bd8f1dc3Sbluhm for (i = 0; i < max_alloc_count; i++) {
2025*bd8f1dc3Sbluhm g_allocation_count = i;
2026*bd8f1dc3Sbluhm XML_SetUserData(g_parser, options);
2027*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
2028*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
2029*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
2030*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
2031*bd8f1dc3Sbluhm break;
2032*bd8f1dc3Sbluhm
2033*bd8f1dc3Sbluhm /* See comment in test_alloc_parse_xdecl() */
2034*bd8f1dc3Sbluhm alloc_teardown();
2035*bd8f1dc3Sbluhm alloc_setup();
2036*bd8f1dc3Sbluhm }
2037*bd8f1dc3Sbluhm if (i == 0)
2038*bd8f1dc3Sbluhm fail("Parsing worked despite failing allocations");
2039*bd8f1dc3Sbluhm else if (i == max_alloc_count)
2040*bd8f1dc3Sbluhm fail("Parsing failed even at max allocation count");
2041*bd8f1dc3Sbluhm }
2042*bd8f1dc3Sbluhm END_TEST
2043*bd8f1dc3Sbluhm
START_TEST(test_alloc_reset_after_external_entity_parser_create_fail)2044*bd8f1dc3Sbluhm START_TEST(test_alloc_reset_after_external_entity_parser_create_fail) {
2045*bd8f1dc3Sbluhm const char *const text = "<!DOCTYPE doc SYSTEM 'foo'><doc/>";
2046*bd8f1dc3Sbluhm
2047*bd8f1dc3Sbluhm XML_SetExternalEntityRefHandler(
2048*bd8f1dc3Sbluhm g_parser, external_entity_parser_create_alloc_fail_handler);
2049*bd8f1dc3Sbluhm XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
2050*bd8f1dc3Sbluhm
2051*bd8f1dc3Sbluhm if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
2052*bd8f1dc3Sbluhm != XML_STATUS_ERROR)
2053*bd8f1dc3Sbluhm fail("Call to parse was expected to fail");
2054*bd8f1dc3Sbluhm
2055*bd8f1dc3Sbluhm if (XML_GetErrorCode(g_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
2056*bd8f1dc3Sbluhm fail("Call to parse was expected to fail from the external entity handler");
2057*bd8f1dc3Sbluhm
2058*bd8f1dc3Sbluhm XML_ParserReset(g_parser, NULL);
2059*bd8f1dc3Sbluhm }
2060*bd8f1dc3Sbluhm END_TEST
2061*bd8f1dc3Sbluhm
2062*bd8f1dc3Sbluhm void
make_alloc_test_case(Suite * s)2063*bd8f1dc3Sbluhm make_alloc_test_case(Suite *s) {
2064*bd8f1dc3Sbluhm TCase *tc_alloc = tcase_create("allocation tests");
2065*bd8f1dc3Sbluhm
2066*bd8f1dc3Sbluhm suite_add_tcase(s, tc_alloc);
2067*bd8f1dc3Sbluhm tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
2068*bd8f1dc3Sbluhm
2069*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
2070*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
2071*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_pi);
2072*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
2073*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
2074*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_comment);
2075*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
2076*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
2077*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
2078*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
2079*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
2080*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
2081*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
2082*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
2083*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
2084*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_set_base);
2085*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
2086*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_ext_entity_realloc_buffer);
2087*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
2088*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
2089*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc,
2090*bd8f1dc3Sbluhm test_alloc_realloc_subst_public_entity_value);
2091*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
2092*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
2093*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
2094*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
2095*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc,
2096*bd8f1dc3Sbluhm test_alloc_realloc_attribute_enum_value);
2097*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
2098*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
2099*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_notation);
2100*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_public_notation);
2101*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_system_notation);
2102*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
2103*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
2104*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_large_group);
2105*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
2106*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
2107*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
2108*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc,
2109*bd8f1dc3Sbluhm test_alloc_realloc_long_attribute_value);
2110*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
2111*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
2112*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
2113*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_attr_value);
2114*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
2115*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc,
2116*bd8f1dc3Sbluhm test_alloc_realloc_param_entity_newline);
2117*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
2118*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
2119*bd8f1dc3Sbluhm tcase_add_test(tc_alloc, test_alloc_long_doc_name);
2120*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_base);
2121*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_public_id);
2122*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_entity_value);
2123*bd8f1dc3Sbluhm tcase_add_test__if_xml_ge(tc_alloc, test_alloc_long_notation);
2124*bd8f1dc3Sbluhm
2125*bd8f1dc3Sbluhm tcase_add_test__ifdef_xml_dtd(
2126*bd8f1dc3Sbluhm tc_alloc, test_alloc_reset_after_external_entity_parser_create_fail);
2127*bd8f1dc3Sbluhm }
2128