xref: /freebsd/contrib/expat/tests/nsalloc_tests.c (revision 4543ef51)
1*4543ef51SXin LI /* Tests in the "namespace allocation" test case for the Expat test suite
2*4543ef51SXin LI                             __  __            _
3*4543ef51SXin LI                          ___\ \/ /_ __   __ _| |_
4*4543ef51SXin LI                         / _ \\  /| '_ \ / _` | __|
5*4543ef51SXin LI                        |  __//  \| |_) | (_| | |_
6*4543ef51SXin LI                         \___/_/\_\ .__/ \__,_|\__|
7*4543ef51SXin LI                                  |_| XML parser
8*4543ef51SXin LI 
9*4543ef51SXin LI    Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
10*4543ef51SXin LI    Copyright (c) 2003      Greg Stein <gstein@users.sourceforge.net>
11*4543ef51SXin LI    Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
12*4543ef51SXin LI    Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
13*4543ef51SXin LI    Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
14*4543ef51SXin LI    Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
15*4543ef51SXin LI    Copyright (c) 2017      Joe Orton <jorton@redhat.com>
16*4543ef51SXin LI    Copyright (c) 2017      José Gutiérrez de la Concha <jose@zeroc.com>
17*4543ef51SXin LI    Copyright (c) 2018      Marco Maggi <marco.maggi-ipsu@poste.it>
18*4543ef51SXin LI    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
19*4543ef51SXin LI    Copyright (c) 2020      Tim Gates <tim.gates@iress.com>
20*4543ef51SXin LI    Copyright (c) 2021      Donghee Na <donghee.na@python.org>
21*4543ef51SXin LI    Licensed under the MIT license:
22*4543ef51SXin LI 
23*4543ef51SXin LI    Permission is  hereby granted,  free of charge,  to any  person obtaining
24*4543ef51SXin LI    a  copy  of  this  software   and  associated  documentation  files  (the
25*4543ef51SXin LI    "Software"),  to  deal in  the  Software  without restriction,  including
26*4543ef51SXin LI    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
27*4543ef51SXin LI    distribute, sublicense, and/or sell copies of the Software, and to permit
28*4543ef51SXin LI    persons  to whom  the Software  is  furnished to  do so,  subject to  the
29*4543ef51SXin LI    following conditions:
30*4543ef51SXin LI 
31*4543ef51SXin LI    The above copyright  notice and this permission notice  shall be included
32*4543ef51SXin LI    in all copies or substantial portions of the Software.
33*4543ef51SXin LI 
34*4543ef51SXin LI    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
35*4543ef51SXin LI    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
36*4543ef51SXin LI    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
37*4543ef51SXin LI    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
38*4543ef51SXin LI    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
39*4543ef51SXin LI    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
40*4543ef51SXin LI    USE OR OTHER DEALINGS IN THE SOFTWARE.
41*4543ef51SXin LI */
42*4543ef51SXin LI 
43*4543ef51SXin LI #if defined(NDEBUG)
44*4543ef51SXin LI #  undef NDEBUG /* because test suite relies on assert(...) at the moment */
45*4543ef51SXin LI #endif
46*4543ef51SXin LI 
47*4543ef51SXin LI #include <string.h>
48*4543ef51SXin LI #include <assert.h>
49*4543ef51SXin LI 
50*4543ef51SXin LI #include "expat.h"
51*4543ef51SXin LI #include "common.h"
52*4543ef51SXin LI #include "minicheck.h"
53*4543ef51SXin LI #include "dummy.h"
54*4543ef51SXin LI #include "handlers.h"
55*4543ef51SXin LI #include "nsalloc_tests.h"
56*4543ef51SXin LI 
57*4543ef51SXin LI static void
nsalloc_setup(void)58*4543ef51SXin LI nsalloc_setup(void) {
59*4543ef51SXin LI   XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
60*4543ef51SXin LI   XML_Char ns_sep[2] = {' ', '\0'};
61*4543ef51SXin LI 
62*4543ef51SXin LI   /* Ensure the parser creation will go through */
63*4543ef51SXin LI   g_allocation_count = ALLOC_ALWAYS_SUCCEED;
64*4543ef51SXin LI   g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
65*4543ef51SXin LI   g_parser = XML_ParserCreate_MM(NULL, &memsuite, ns_sep);
66*4543ef51SXin LI   if (g_parser == NULL)
67*4543ef51SXin LI     fail("Parser not created");
68*4543ef51SXin LI }
69*4543ef51SXin LI 
70*4543ef51SXin LI static void
nsalloc_teardown(void)71*4543ef51SXin LI nsalloc_teardown(void) {
72*4543ef51SXin LI   basic_teardown();
73*4543ef51SXin LI }
74*4543ef51SXin LI 
75*4543ef51SXin LI /* Test the effects of allocation failure in simple namespace parsing.
76*4543ef51SXin LI  * Based on test_ns_default_with_empty_uri()
77*4543ef51SXin LI  */
START_TEST(test_nsalloc_xmlns)78*4543ef51SXin LI START_TEST(test_nsalloc_xmlns) {
79*4543ef51SXin LI   const char *text = "<doc xmlns='http://example.org/'>\n"
80*4543ef51SXin LI                      "  <e xmlns=''/>\n"
81*4543ef51SXin LI                      "</doc>";
82*4543ef51SXin LI   unsigned int i;
83*4543ef51SXin LI   const unsigned int max_alloc_count = 30;
84*4543ef51SXin LI 
85*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
86*4543ef51SXin LI     g_allocation_count = i;
87*4543ef51SXin LI     /* Exercise more code paths with a default handler */
88*4543ef51SXin LI     XML_SetDefaultHandler(g_parser, dummy_default_handler);
89*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
90*4543ef51SXin LI         != XML_STATUS_ERROR)
91*4543ef51SXin LI       break;
92*4543ef51SXin LI     /* Resetting the parser is insufficient, because some memory
93*4543ef51SXin LI      * allocations are cached within the parser.  Instead we use
94*4543ef51SXin LI      * the teardown and setup routines to ensure that we have the
95*4543ef51SXin LI      * right sort of parser back in our hands.
96*4543ef51SXin LI      */
97*4543ef51SXin LI     nsalloc_teardown();
98*4543ef51SXin LI     nsalloc_setup();
99*4543ef51SXin LI   }
100*4543ef51SXin LI   if (i == 0)
101*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
102*4543ef51SXin LI   else if (i == max_alloc_count)
103*4543ef51SXin LI     fail("Parsing failed even at maximum allocation count");
104*4543ef51SXin LI }
105*4543ef51SXin LI END_TEST
106*4543ef51SXin LI 
107*4543ef51SXin LI /* Test XML_ParseBuffer interface with namespace and a dicky allocator */
START_TEST(test_nsalloc_parse_buffer)108*4543ef51SXin LI START_TEST(test_nsalloc_parse_buffer) {
109*4543ef51SXin LI   const char *text = "<doc>Hello</doc>";
110*4543ef51SXin LI   void *buffer;
111*4543ef51SXin LI 
112*4543ef51SXin LI   /* Try a parse before the start of the world */
113*4543ef51SXin LI   /* (Exercises new code path) */
114*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
115*4543ef51SXin LI     fail("Pre-init XML_ParseBuffer not faulted");
116*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_BUFFER)
117*4543ef51SXin LI     fail("Pre-init XML_ParseBuffer faulted for wrong reason");
118*4543ef51SXin LI 
119*4543ef51SXin LI   buffer = XML_GetBuffer(g_parser, 1 /* any small number greater than 0 */);
120*4543ef51SXin LI   if (buffer == NULL)
121*4543ef51SXin LI     fail("Could not acquire parse buffer");
122*4543ef51SXin LI 
123*4543ef51SXin LI   g_allocation_count = 0;
124*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
125*4543ef51SXin LI     fail("Pre-init XML_ParseBuffer not faulted");
126*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_MEMORY)
127*4543ef51SXin LI     fail("Pre-init XML_ParseBuffer faulted for wrong reason");
128*4543ef51SXin LI 
129*4543ef51SXin LI   /* Now with actual memory allocation */
130*4543ef51SXin LI   g_allocation_count = ALLOC_ALWAYS_SUCCEED;
131*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_OK)
132*4543ef51SXin LI     xml_failure(g_parser);
133*4543ef51SXin LI 
134*4543ef51SXin LI   /* Check that resuming an unsuspended parser is faulted */
135*4543ef51SXin LI   if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
136*4543ef51SXin LI     fail("Resuming unsuspended parser not faulted");
137*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_NOT_SUSPENDED)
138*4543ef51SXin LI     xml_failure(g_parser);
139*4543ef51SXin LI 
140*4543ef51SXin LI   /* Get the parser into suspended state */
141*4543ef51SXin LI   XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
142*4543ef51SXin LI   g_resumable = XML_TRUE;
143*4543ef51SXin LI   buffer = XML_GetBuffer(g_parser, (int)strlen(text));
144*4543ef51SXin LI   if (buffer == NULL)
145*4543ef51SXin LI     fail("Could not acquire parse buffer");
146*4543ef51SXin LI   assert(buffer != NULL);
147*4543ef51SXin LI   memcpy(buffer, text, strlen(text));
148*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
149*4543ef51SXin LI       != XML_STATUS_SUSPENDED)
150*4543ef51SXin LI     xml_failure(g_parser);
151*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
152*4543ef51SXin LI     xml_failure(g_parser);
153*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
154*4543ef51SXin LI       != XML_STATUS_ERROR)
155*4543ef51SXin LI     fail("Suspended XML_ParseBuffer not faulted");
156*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
157*4543ef51SXin LI     xml_failure(g_parser);
158*4543ef51SXin LI   if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
159*4543ef51SXin LI     fail("Suspended XML_GetBuffer not faulted");
160*4543ef51SXin LI 
161*4543ef51SXin LI   /* Get it going again and complete the world */
162*4543ef51SXin LI   XML_SetCharacterDataHandler(g_parser, NULL);
163*4543ef51SXin LI   if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
164*4543ef51SXin LI     xml_failure(g_parser);
165*4543ef51SXin LI   if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
166*4543ef51SXin LI       != XML_STATUS_ERROR)
167*4543ef51SXin LI     fail("Post-finishing XML_ParseBuffer not faulted");
168*4543ef51SXin LI   if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
169*4543ef51SXin LI     xml_failure(g_parser);
170*4543ef51SXin LI   if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
171*4543ef51SXin LI     fail("Post-finishing XML_GetBuffer not faulted");
172*4543ef51SXin LI }
173*4543ef51SXin LI END_TEST
174*4543ef51SXin LI 
175*4543ef51SXin LI /* Check handling of long prefix names (pool growth) */
START_TEST(test_nsalloc_long_prefix)176*4543ef51SXin LI START_TEST(test_nsalloc_long_prefix) {
177*4543ef51SXin LI   const char *text
178*4543ef51SXin LI       = "<"
179*4543ef51SXin LI         /* 64 characters per line */
180*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
181*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
182*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
183*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
184*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
185*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
186*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
187*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
188*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
189*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
190*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
191*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
192*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
193*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
194*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
195*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
196*4543ef51SXin LI         ":foo xmlns:"
197*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
198*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
199*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
200*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
201*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
202*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
203*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
204*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
205*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
206*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
207*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
208*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
209*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
210*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
211*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
212*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
213*4543ef51SXin LI         "='http://example.org/'>"
214*4543ef51SXin LI         "</"
215*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
216*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
217*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
218*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
219*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
220*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
221*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
222*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
223*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
224*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
225*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
226*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
227*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
228*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
229*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
230*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
231*4543ef51SXin LI         ":foo>";
232*4543ef51SXin LI   int i;
233*4543ef51SXin LI   const int max_alloc_count = 40;
234*4543ef51SXin LI 
235*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
236*4543ef51SXin LI     g_allocation_count = i;
237*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
238*4543ef51SXin LI         != XML_STATUS_ERROR)
239*4543ef51SXin LI       break;
240*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
241*4543ef51SXin LI     nsalloc_teardown();
242*4543ef51SXin LI     nsalloc_setup();
243*4543ef51SXin LI   }
244*4543ef51SXin LI   if (i == 0)
245*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
246*4543ef51SXin LI   else if (i == max_alloc_count)
247*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
248*4543ef51SXin LI }
249*4543ef51SXin LI END_TEST
250*4543ef51SXin LI 
251*4543ef51SXin LI /* Check handling of long uri names (pool growth) */
START_TEST(test_nsalloc_long_uri)252*4543ef51SXin LI START_TEST(test_nsalloc_long_uri) {
253*4543ef51SXin LI   const char *text
254*4543ef51SXin LI       = "<foo:e xmlns:foo='http://example.org/"
255*4543ef51SXin LI         /* 64 characters per line */
256*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
257*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
258*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
259*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
260*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
261*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
262*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
263*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
264*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
265*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
266*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
267*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
268*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
269*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
270*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
271*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
272*4543ef51SXin LI         "' bar:a='12'\n"
273*4543ef51SXin LI         "xmlns:bar='http://example.org/"
274*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
275*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
276*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
277*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
278*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
279*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
280*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
281*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
282*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
283*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
284*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
285*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
286*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
287*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
288*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
289*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
290*4543ef51SXin LI         "'>"
291*4543ef51SXin LI         "</foo:e>";
292*4543ef51SXin LI   int i;
293*4543ef51SXin LI   const int max_alloc_count = 40;
294*4543ef51SXin LI 
295*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
296*4543ef51SXin LI     g_allocation_count = i;
297*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
298*4543ef51SXin LI         != XML_STATUS_ERROR)
299*4543ef51SXin LI       break;
300*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
301*4543ef51SXin LI     nsalloc_teardown();
302*4543ef51SXin LI     nsalloc_setup();
303*4543ef51SXin LI   }
304*4543ef51SXin LI   if (i == 0)
305*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
306*4543ef51SXin LI   else if (i == max_alloc_count)
307*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
308*4543ef51SXin LI }
309*4543ef51SXin LI END_TEST
310*4543ef51SXin LI 
311*4543ef51SXin LI /* Test handling of long attribute names with prefixes */
START_TEST(test_nsalloc_long_attr)312*4543ef51SXin LI START_TEST(test_nsalloc_long_attr) {
313*4543ef51SXin LI   const char *text
314*4543ef51SXin LI       = "<foo:e xmlns:foo='http://example.org/' bar:"
315*4543ef51SXin LI         /* 64 characters per line */
316*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
317*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
318*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
319*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
320*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
321*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
322*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
323*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
324*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
325*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
326*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
327*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
328*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
329*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
330*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
331*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
332*4543ef51SXin LI         "='12'\n"
333*4543ef51SXin LI         "xmlns:bar='http://example.org/'>"
334*4543ef51SXin LI         "</foo:e>";
335*4543ef51SXin LI   int i;
336*4543ef51SXin LI   const int max_alloc_count = 40;
337*4543ef51SXin LI 
338*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
339*4543ef51SXin LI     g_allocation_count = i;
340*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
341*4543ef51SXin LI         != XML_STATUS_ERROR)
342*4543ef51SXin LI       break;
343*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
344*4543ef51SXin LI     nsalloc_teardown();
345*4543ef51SXin LI     nsalloc_setup();
346*4543ef51SXin LI   }
347*4543ef51SXin LI   if (i == 0)
348*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
349*4543ef51SXin LI   else if (i == max_alloc_count)
350*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
351*4543ef51SXin LI }
352*4543ef51SXin LI END_TEST
353*4543ef51SXin LI 
354*4543ef51SXin LI /* Test handling of an attribute name with a long namespace prefix */
START_TEST(test_nsalloc_long_attr_prefix)355*4543ef51SXin LI START_TEST(test_nsalloc_long_attr_prefix) {
356*4543ef51SXin LI   const char *text
357*4543ef51SXin LI       = "<foo:e xmlns:foo='http://example.org/' "
358*4543ef51SXin LI         /* 64 characters per line */
359*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
360*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
361*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
362*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
363*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
364*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
365*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
366*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
367*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
368*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
369*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
370*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
371*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
372*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
373*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
374*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
375*4543ef51SXin LI         ":a='12'\n"
376*4543ef51SXin LI         "xmlns:"
377*4543ef51SXin LI         /* 64 characters per line */
378*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
379*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
380*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
381*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
382*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
383*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
384*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
385*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
386*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
387*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
388*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
389*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
390*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
391*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
392*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
393*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
394*4543ef51SXin LI         "='http://example.org/'>"
395*4543ef51SXin LI         "</foo:e>";
396*4543ef51SXin LI   const XML_Char *elemstr[] = {
397*4543ef51SXin LI       /* clang-format off */
398*4543ef51SXin LI         XCS("http://example.org/ e foo"),
399*4543ef51SXin LI         XCS("http://example.org/ a ")
400*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
401*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
402*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
403*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
404*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
405*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
406*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
407*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
408*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
409*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
410*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
411*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
412*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
413*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
414*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
415*4543ef51SXin LI         XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
416*4543ef51SXin LI       /* clang-format on */
417*4543ef51SXin LI   };
418*4543ef51SXin LI   int i;
419*4543ef51SXin LI   const int max_alloc_count = 40;
420*4543ef51SXin LI 
421*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
422*4543ef51SXin LI     g_allocation_count = i;
423*4543ef51SXin LI     XML_SetReturnNSTriplet(g_parser, XML_TRUE);
424*4543ef51SXin LI     XML_SetUserData(g_parser, (void *)elemstr);
425*4543ef51SXin LI     XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
426*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
427*4543ef51SXin LI         != XML_STATUS_ERROR)
428*4543ef51SXin LI       break;
429*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
430*4543ef51SXin LI     nsalloc_teardown();
431*4543ef51SXin LI     nsalloc_setup();
432*4543ef51SXin LI   }
433*4543ef51SXin LI   if (i == 0)
434*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
435*4543ef51SXin LI   else if (i == max_alloc_count)
436*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
437*4543ef51SXin LI }
438*4543ef51SXin LI END_TEST
439*4543ef51SXin LI 
440*4543ef51SXin LI /* Test attribute handling in the face of a dodgy reallocator */
START_TEST(test_nsalloc_realloc_attributes)441*4543ef51SXin LI START_TEST(test_nsalloc_realloc_attributes) {
442*4543ef51SXin LI   const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
443*4543ef51SXin LI                      "       xmlns:bar='http://example.org/'>"
444*4543ef51SXin LI                      "</foo:e>";
445*4543ef51SXin LI   int i;
446*4543ef51SXin LI   const int max_realloc_count = 10;
447*4543ef51SXin LI 
448*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
449*4543ef51SXin LI     g_reallocation_count = i;
450*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
451*4543ef51SXin LI         != XML_STATUS_ERROR)
452*4543ef51SXin LI       break;
453*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
454*4543ef51SXin LI     nsalloc_teardown();
455*4543ef51SXin LI     nsalloc_setup();
456*4543ef51SXin LI   }
457*4543ef51SXin LI   if (i == 0)
458*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
459*4543ef51SXin LI   else if (i == max_realloc_count)
460*4543ef51SXin LI     fail("Parsing failed at max reallocation count");
461*4543ef51SXin LI }
462*4543ef51SXin LI END_TEST
463*4543ef51SXin LI 
464*4543ef51SXin LI /* Test long element names with namespaces under a failing allocator */
START_TEST(test_nsalloc_long_element)465*4543ef51SXin LI START_TEST(test_nsalloc_long_element) {
466*4543ef51SXin LI   const char *text
467*4543ef51SXin LI       = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
468*4543ef51SXin LI         " xmlns:foo='http://example.org/' bar:a='12'\n"
469*4543ef51SXin LI         " xmlns:bar='http://example.org/'>"
470*4543ef51SXin LI         "</foo:thisisalongenoughelementnametotriggerareallocation>";
471*4543ef51SXin LI   const XML_Char *elemstr[]
472*4543ef51SXin LI       = {XCS("http://example.org/")
473*4543ef51SXin LI              XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
474*4543ef51SXin LI          XCS("http://example.org/ a bar")};
475*4543ef51SXin LI   int i;
476*4543ef51SXin LI   const int max_alloc_count = 30;
477*4543ef51SXin LI 
478*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
479*4543ef51SXin LI     g_allocation_count = i;
480*4543ef51SXin LI     XML_SetReturnNSTriplet(g_parser, XML_TRUE);
481*4543ef51SXin LI     XML_SetUserData(g_parser, (void *)elemstr);
482*4543ef51SXin LI     XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
483*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
484*4543ef51SXin LI         != XML_STATUS_ERROR)
485*4543ef51SXin LI       break;
486*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
487*4543ef51SXin LI     nsalloc_teardown();
488*4543ef51SXin LI     nsalloc_setup();
489*4543ef51SXin LI   }
490*4543ef51SXin LI   if (i == 0)
491*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
492*4543ef51SXin LI   else if (i == max_alloc_count)
493*4543ef51SXin LI     fail("Parsing failed at max reallocation count");
494*4543ef51SXin LI }
495*4543ef51SXin LI END_TEST
496*4543ef51SXin LI 
497*4543ef51SXin LI /* Test the effects of reallocation failure when reassigning a
498*4543ef51SXin LI  * binding.
499*4543ef51SXin LI  *
500*4543ef51SXin LI  * XML_ParserReset does not free the BINDING structures used by a
501*4543ef51SXin LI  * parser, but instead adds them to an internal free list to be reused
502*4543ef51SXin LI  * as necessary.  Likewise the URI buffers allocated for the binding
503*4543ef51SXin LI  * aren't freed, but kept attached to their existing binding.  If the
504*4543ef51SXin LI  * new binding has a longer URI, it will need reallocation.  This test
505*4543ef51SXin LI  * provokes that reallocation, and tests the control path if it fails.
506*4543ef51SXin LI  */
START_TEST(test_nsalloc_realloc_binding_uri)507*4543ef51SXin LI START_TEST(test_nsalloc_realloc_binding_uri) {
508*4543ef51SXin LI   const char *first = "<doc xmlns='http://example.org/'>\n"
509*4543ef51SXin LI                       "  <e xmlns='' />\n"
510*4543ef51SXin LI                       "</doc>";
511*4543ef51SXin LI   const char *second
512*4543ef51SXin LI       = "<doc xmlns='http://example.org/long/enough/URI/to/reallocate/'>\n"
513*4543ef51SXin LI         "  <e xmlns='' />\n"
514*4543ef51SXin LI         "</doc>";
515*4543ef51SXin LI   unsigned i;
516*4543ef51SXin LI   const unsigned max_realloc_count = 10;
517*4543ef51SXin LI 
518*4543ef51SXin LI   /* First, do a full parse that will leave bindings around */
519*4543ef51SXin LI   if (_XML_Parse_SINGLE_BYTES(g_parser, first, (int)strlen(first), XML_TRUE)
520*4543ef51SXin LI       == XML_STATUS_ERROR)
521*4543ef51SXin LI     xml_failure(g_parser);
522*4543ef51SXin LI 
523*4543ef51SXin LI   /* Now repeat with a longer URI and a duff reallocator */
524*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
525*4543ef51SXin LI     XML_ParserReset(g_parser, NULL);
526*4543ef51SXin LI     g_reallocation_count = i;
527*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, second, (int)strlen(second), XML_TRUE)
528*4543ef51SXin LI         != XML_STATUS_ERROR)
529*4543ef51SXin LI       break;
530*4543ef51SXin LI   }
531*4543ef51SXin LI   if (i == 0)
532*4543ef51SXin LI     fail("Parsing worked despite failing reallocation");
533*4543ef51SXin LI   else if (i == max_realloc_count)
534*4543ef51SXin LI     fail("Parsing failed at max reallocation count");
535*4543ef51SXin LI }
536*4543ef51SXin LI END_TEST
537*4543ef51SXin LI 
538*4543ef51SXin LI /* Check handling of long prefix names (pool growth) */
START_TEST(test_nsalloc_realloc_long_prefix)539*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_prefix) {
540*4543ef51SXin LI   const char *text
541*4543ef51SXin LI       = "<"
542*4543ef51SXin LI         /* 64 characters per line */
543*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
544*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
545*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
546*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
547*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
548*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
549*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
550*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
551*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
552*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
553*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
554*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
555*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
556*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
557*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
558*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
559*4543ef51SXin LI         ":foo xmlns:"
560*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
561*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
562*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
563*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
564*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
565*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
566*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
567*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
568*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
569*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
570*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
571*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
572*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
573*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
574*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
575*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
576*4543ef51SXin LI         "='http://example.org/'>"
577*4543ef51SXin LI         "</"
578*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
579*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
580*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
581*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
582*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
583*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
584*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
585*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
586*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
587*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
588*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
589*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
590*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
591*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
592*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
593*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
594*4543ef51SXin LI         ":foo>";
595*4543ef51SXin LI   int i;
596*4543ef51SXin LI   const int max_realloc_count = 12;
597*4543ef51SXin LI 
598*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
599*4543ef51SXin LI     g_reallocation_count = i;
600*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
601*4543ef51SXin LI         != XML_STATUS_ERROR)
602*4543ef51SXin LI       break;
603*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
604*4543ef51SXin LI     nsalloc_teardown();
605*4543ef51SXin LI     nsalloc_setup();
606*4543ef51SXin LI   }
607*4543ef51SXin LI   if (i == 0)
608*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
609*4543ef51SXin LI   else if (i == max_realloc_count)
610*4543ef51SXin LI     fail("Parsing failed even at max reallocation count");
611*4543ef51SXin LI }
612*4543ef51SXin LI END_TEST
613*4543ef51SXin LI 
614*4543ef51SXin LI /* Check handling of even long prefix names (different code path) */
START_TEST(test_nsalloc_realloc_longer_prefix)615*4543ef51SXin LI START_TEST(test_nsalloc_realloc_longer_prefix) {
616*4543ef51SXin LI   const char *text
617*4543ef51SXin LI       = "<"
618*4543ef51SXin LI         /* 64 characters per line */
619*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
620*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
621*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
622*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
623*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
624*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
625*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
626*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
627*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
628*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
629*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
630*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
631*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
632*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
633*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
634*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
635*4543ef51SXin LI         "Q:foo xmlns:"
636*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
637*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
638*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
639*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
640*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
641*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
642*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
643*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
644*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
645*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
646*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
647*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
648*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
649*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
650*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
651*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
652*4543ef51SXin LI         "Q='http://example.org/'>"
653*4543ef51SXin LI         "</"
654*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
655*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
656*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
657*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
658*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
659*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
660*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
661*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
662*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
663*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
664*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
665*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
666*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
667*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
668*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
669*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
670*4543ef51SXin LI         "Q:foo>";
671*4543ef51SXin LI   int i;
672*4543ef51SXin LI   const int max_realloc_count = 12;
673*4543ef51SXin LI 
674*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
675*4543ef51SXin LI     g_reallocation_count = i;
676*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
677*4543ef51SXin LI         != XML_STATUS_ERROR)
678*4543ef51SXin LI       break;
679*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
680*4543ef51SXin LI     nsalloc_teardown();
681*4543ef51SXin LI     nsalloc_setup();
682*4543ef51SXin LI   }
683*4543ef51SXin LI   if (i == 0)
684*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
685*4543ef51SXin LI   else if (i == max_realloc_count)
686*4543ef51SXin LI     fail("Parsing failed even at max reallocation count");
687*4543ef51SXin LI }
688*4543ef51SXin LI END_TEST
689*4543ef51SXin LI 
START_TEST(test_nsalloc_long_namespace)690*4543ef51SXin LI START_TEST(test_nsalloc_long_namespace) {
691*4543ef51SXin LI   const char *text1
692*4543ef51SXin LI       = "<"
693*4543ef51SXin LI         /* 64 characters per line */
694*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
695*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
696*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
697*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
698*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
699*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
700*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
701*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
702*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
703*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
704*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
705*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
706*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
707*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
708*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
709*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
710*4543ef51SXin LI         ":e xmlns:"
711*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
712*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
713*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
714*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
715*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
716*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
717*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
718*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
719*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
720*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
721*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
722*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
723*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
724*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
725*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
726*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
727*4543ef51SXin LI         "='http://example.org/'>\n";
728*4543ef51SXin LI   const char *text2
729*4543ef51SXin LI       = "<"
730*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
731*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
732*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
733*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
734*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
735*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
736*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
737*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
738*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
739*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
740*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
741*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
742*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
743*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
744*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
745*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
746*4543ef51SXin LI         ":f "
747*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
748*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
749*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
750*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
751*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
752*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
753*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
754*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
755*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
756*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
757*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
758*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
759*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
760*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
761*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
762*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
763*4543ef51SXin LI         ":attr='foo'/>\n"
764*4543ef51SXin LI         "</"
765*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
766*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
767*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
768*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
769*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
770*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
771*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
772*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
773*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
774*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
775*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
776*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
777*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
778*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
779*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
780*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
781*4543ef51SXin LI         ":e>";
782*4543ef51SXin LI   int i;
783*4543ef51SXin LI   const int max_alloc_count = 40;
784*4543ef51SXin LI 
785*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
786*4543ef51SXin LI     g_allocation_count = i;
787*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
788*4543ef51SXin LI             != XML_STATUS_ERROR
789*4543ef51SXin LI         && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
790*4543ef51SXin LI                                    XML_TRUE)
791*4543ef51SXin LI                != XML_STATUS_ERROR)
792*4543ef51SXin LI       break;
793*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
794*4543ef51SXin LI     nsalloc_teardown();
795*4543ef51SXin LI     nsalloc_setup();
796*4543ef51SXin LI   }
797*4543ef51SXin LI   if (i == 0)
798*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
799*4543ef51SXin LI   else if (i == max_alloc_count)
800*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
801*4543ef51SXin LI }
802*4543ef51SXin LI END_TEST
803*4543ef51SXin LI 
804*4543ef51SXin LI /* Using a slightly shorter namespace name provokes allocations in
805*4543ef51SXin LI  * slightly different places in the code.
806*4543ef51SXin LI  */
START_TEST(test_nsalloc_less_long_namespace)807*4543ef51SXin LI START_TEST(test_nsalloc_less_long_namespace) {
808*4543ef51SXin LI   const char *text
809*4543ef51SXin LI       = "<"
810*4543ef51SXin LI         /* 64 characters per line */
811*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
812*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
813*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
814*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
815*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
816*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
817*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
818*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
819*4543ef51SXin LI         ":e xmlns:"
820*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
821*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
822*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
823*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
824*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
825*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
826*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
827*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
828*4543ef51SXin LI         "='http://example.org/'>\n"
829*4543ef51SXin LI         "<"
830*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
831*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
832*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
833*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
834*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
835*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
836*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
837*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
838*4543ef51SXin LI         ":f "
839*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
840*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
841*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
842*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
843*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
844*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
845*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
846*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
847*4543ef51SXin LI         ":att='foo'/>\n"
848*4543ef51SXin LI         "</"
849*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
850*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
851*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
852*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
853*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
854*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
855*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
856*4543ef51SXin LI         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
857*4543ef51SXin LI         ":e>";
858*4543ef51SXin LI   int i;
859*4543ef51SXin LI   const int max_alloc_count = 40;
860*4543ef51SXin LI 
861*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
862*4543ef51SXin LI     g_allocation_count = i;
863*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
864*4543ef51SXin LI         != XML_STATUS_ERROR)
865*4543ef51SXin LI       break;
866*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
867*4543ef51SXin LI     nsalloc_teardown();
868*4543ef51SXin LI     nsalloc_setup();
869*4543ef51SXin LI   }
870*4543ef51SXin LI   if (i == 0)
871*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
872*4543ef51SXin LI   else if (i == max_alloc_count)
873*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
874*4543ef51SXin LI }
875*4543ef51SXin LI END_TEST
876*4543ef51SXin LI 
START_TEST(test_nsalloc_long_context)877*4543ef51SXin LI START_TEST(test_nsalloc_long_context) {
878*4543ef51SXin LI   const char *text
879*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
880*4543ef51SXin LI         "  <!ATTLIST doc baz ID #REQUIRED>\n"
881*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
882*4543ef51SXin LI         "]>\n"
883*4543ef51SXin LI         "<doc xmlns='http://example.org/"
884*4543ef51SXin LI         /* 64 characters per line */
885*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
886*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
887*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
888*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
889*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
890*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
891*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
892*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
893*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
894*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
895*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
896*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
897*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
898*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
899*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
900*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
901*4543ef51SXin LI         "' baz='2'>\n"
902*4543ef51SXin LI         "&en;"
903*4543ef51SXin LI         "</doc>";
904*4543ef51SXin LI   ExtOption options[] = {
905*4543ef51SXin LI       {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
906*4543ef51SXin LI   int i;
907*4543ef51SXin LI   const int max_alloc_count = 70;
908*4543ef51SXin LI 
909*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
910*4543ef51SXin LI     g_allocation_count = i;
911*4543ef51SXin LI     XML_SetUserData(g_parser, options);
912*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
913*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
914*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
915*4543ef51SXin LI         != XML_STATUS_ERROR)
916*4543ef51SXin LI       break;
917*4543ef51SXin LI 
918*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
919*4543ef51SXin LI     nsalloc_teardown();
920*4543ef51SXin LI     nsalloc_setup();
921*4543ef51SXin LI   }
922*4543ef51SXin LI   if (i == 0)
923*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
924*4543ef51SXin LI   else if (i == max_alloc_count)
925*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
926*4543ef51SXin LI }
927*4543ef51SXin LI END_TEST
928*4543ef51SXin LI 
929*4543ef51SXin LI /* This function is void; it will throw a fail() on error, so if it
930*4543ef51SXin LI  * returns normally it must have succeeded.
931*4543ef51SXin LI  */
932*4543ef51SXin LI static void
context_realloc_test(const char * text)933*4543ef51SXin LI context_realloc_test(const char *text) {
934*4543ef51SXin LI   ExtOption options[] = {
935*4543ef51SXin LI       {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
936*4543ef51SXin LI   int i;
937*4543ef51SXin LI   const int max_realloc_count = 6;
938*4543ef51SXin LI 
939*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
940*4543ef51SXin LI     g_reallocation_count = i;
941*4543ef51SXin LI     XML_SetUserData(g_parser, options);
942*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
943*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
944*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
945*4543ef51SXin LI         != XML_STATUS_ERROR)
946*4543ef51SXin LI       break;
947*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
948*4543ef51SXin LI     nsalloc_teardown();
949*4543ef51SXin LI     nsalloc_setup();
950*4543ef51SXin LI   }
951*4543ef51SXin LI   if (i == 0)
952*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
953*4543ef51SXin LI   else if (i == max_realloc_count)
954*4543ef51SXin LI     fail("Parsing failed even at max reallocation count");
955*4543ef51SXin LI }
956*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context)957*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context) {
958*4543ef51SXin LI   const char *text
959*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
960*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
961*4543ef51SXin LI         "]>\n"
962*4543ef51SXin LI         "<doc xmlns='http://example.org/"
963*4543ef51SXin LI         /* 64 characters per line */
964*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
965*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
966*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
967*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
968*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
969*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
970*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
971*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
972*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
973*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
974*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
975*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
976*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
977*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
978*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
979*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
980*4543ef51SXin LI         "'>\n"
981*4543ef51SXin LI         "&en;"
982*4543ef51SXin LI         "</doc>";
983*4543ef51SXin LI 
984*4543ef51SXin LI   context_realloc_test(text);
985*4543ef51SXin LI }
986*4543ef51SXin LI END_TEST
987*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_2)988*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_2) {
989*4543ef51SXin LI   const char *text
990*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
991*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
992*4543ef51SXin LI         "]>\n"
993*4543ef51SXin LI         "<doc xmlns='http://example.org/"
994*4543ef51SXin LI         /* 64 characters per line */
995*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
996*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
997*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
998*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
999*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1000*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1001*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1002*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1003*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1004*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1005*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1006*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1007*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1008*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1009*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1010*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJK"
1011*4543ef51SXin LI         "'>\n"
1012*4543ef51SXin LI         "&en;"
1013*4543ef51SXin LI         "</doc>";
1014*4543ef51SXin LI 
1015*4543ef51SXin LI   context_realloc_test(text);
1016*4543ef51SXin LI }
1017*4543ef51SXin LI END_TEST
1018*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_3)1019*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_3) {
1020*4543ef51SXin LI   const char *text
1021*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1022*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
1023*4543ef51SXin LI         "]>\n"
1024*4543ef51SXin LI         "<doc xmlns='http://example.org/"
1025*4543ef51SXin LI         /* 64 characters per line */
1026*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1027*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1028*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1029*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1030*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1031*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1032*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1033*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1034*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1035*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1036*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1037*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1038*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1039*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1040*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1041*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGH"
1042*4543ef51SXin LI         "'>\n"
1043*4543ef51SXin LI         "&en;"
1044*4543ef51SXin LI         "</doc>";
1045*4543ef51SXin LI 
1046*4543ef51SXin LI   context_realloc_test(text);
1047*4543ef51SXin LI }
1048*4543ef51SXin LI END_TEST
1049*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_4)1050*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_4) {
1051*4543ef51SXin LI   const char *text
1052*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1053*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
1054*4543ef51SXin LI         "]>\n"
1055*4543ef51SXin LI         "<doc xmlns='http://example.org/"
1056*4543ef51SXin LI         /* 64 characters per line */
1057*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1058*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1059*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1060*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1061*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1062*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1063*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1064*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1065*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1066*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1067*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1068*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1069*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1070*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1071*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1072*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO"
1073*4543ef51SXin LI         "'>\n"
1074*4543ef51SXin LI         "&en;"
1075*4543ef51SXin LI         "</doc>";
1076*4543ef51SXin LI 
1077*4543ef51SXin LI   context_realloc_test(text);
1078*4543ef51SXin LI }
1079*4543ef51SXin LI END_TEST
1080*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_5)1081*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_5) {
1082*4543ef51SXin LI   const char *text
1083*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1084*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
1085*4543ef51SXin LI         "]>\n"
1086*4543ef51SXin LI         "<doc xmlns='http://example.org/"
1087*4543ef51SXin LI         /* 64 characters per line */
1088*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1089*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1090*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1091*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1092*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1093*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1094*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1095*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1096*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1097*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1098*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1099*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1100*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1101*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1102*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1103*4543ef51SXin LI         "ABC"
1104*4543ef51SXin LI         "'>\n"
1105*4543ef51SXin LI         "&en;"
1106*4543ef51SXin LI         "</doc>";
1107*4543ef51SXin LI 
1108*4543ef51SXin LI   context_realloc_test(text);
1109*4543ef51SXin LI }
1110*4543ef51SXin LI END_TEST
1111*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_6)1112*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_6) {
1113*4543ef51SXin LI   const char *text
1114*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1115*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
1116*4543ef51SXin LI         "]>\n"
1117*4543ef51SXin LI         "<doc xmlns='http://example.org/"
1118*4543ef51SXin LI         /* 64 characters per line */
1119*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1120*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1121*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1122*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1123*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1124*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1125*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1126*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1127*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1128*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1129*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1130*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1131*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1132*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1133*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
1134*4543ef51SXin LI         "'>\n"
1135*4543ef51SXin LI         "&en;"
1136*4543ef51SXin LI         "</doc>";
1137*4543ef51SXin LI 
1138*4543ef51SXin LI   context_realloc_test(text);
1139*4543ef51SXin LI }
1140*4543ef51SXin LI END_TEST
1141*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_context_7)1142*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_7) {
1143*4543ef51SXin LI   const char *text
1144*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1145*4543ef51SXin LI         "  <!ENTITY en SYSTEM 'bar'>\n"
1146*4543ef51SXin LI         "]>\n"
1147*4543ef51SXin LI         "<doc xmlns='http://example.org/"
1148*4543ef51SXin LI         /* 64 characters per line */
1149*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1150*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1151*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1152*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1153*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1154*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1155*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1156*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1157*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1158*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1159*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1160*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1161*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1162*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1163*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1164*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLM"
1165*4543ef51SXin LI         "'>\n"
1166*4543ef51SXin LI         "&en;"
1167*4543ef51SXin LI         "</doc>";
1168*4543ef51SXin LI 
1169*4543ef51SXin LI   context_realloc_test(text);
1170*4543ef51SXin LI }
1171*4543ef51SXin LI END_TEST
1172*4543ef51SXin LI 
START_TEST(test_nsalloc_realloc_long_ge_name)1173*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_ge_name) {
1174*4543ef51SXin LI   const char *text
1175*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1176*4543ef51SXin LI         "  <!ENTITY "
1177*4543ef51SXin LI         /* 64 characters per line */
1178*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1179*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1180*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1181*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1182*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1183*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1184*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1185*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1186*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1187*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1188*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1189*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1190*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1191*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1192*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1193*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1194*4543ef51SXin LI         " SYSTEM 'bar'>\n"
1195*4543ef51SXin LI         "]>\n"
1196*4543ef51SXin LI         "<doc xmlns='http://example.org/baz'>\n"
1197*4543ef51SXin LI         "&"
1198*4543ef51SXin LI         /* 64 characters per line */
1199*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1200*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1201*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1202*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1203*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1204*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1205*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1206*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1207*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1208*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1209*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1210*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1211*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1212*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1213*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1214*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1215*4543ef51SXin LI         ";"
1216*4543ef51SXin LI         "</doc>";
1217*4543ef51SXin LI   ExtOption options[] = {
1218*4543ef51SXin LI       {XCS("foo"), "<!ELEMENT el EMPTY>"}, {XCS("bar"), "<el/>"}, {NULL, NULL}};
1219*4543ef51SXin LI   int i;
1220*4543ef51SXin LI   const int max_realloc_count = 10;
1221*4543ef51SXin LI 
1222*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
1223*4543ef51SXin LI     g_reallocation_count = i;
1224*4543ef51SXin LI     XML_SetUserData(g_parser, options);
1225*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1226*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
1227*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1228*4543ef51SXin LI         != XML_STATUS_ERROR)
1229*4543ef51SXin LI       break;
1230*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
1231*4543ef51SXin LI     nsalloc_teardown();
1232*4543ef51SXin LI     nsalloc_setup();
1233*4543ef51SXin LI   }
1234*4543ef51SXin LI   if (i == 0)
1235*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
1236*4543ef51SXin LI   else if (i == max_realloc_count)
1237*4543ef51SXin LI     fail("Parsing failed even at max reallocation count");
1238*4543ef51SXin LI }
1239*4543ef51SXin LI END_TEST
1240*4543ef51SXin LI 
1241*4543ef51SXin LI /* Test that when a namespace is passed through the context mechanism
1242*4543ef51SXin LI  * to an external entity parser, the parsers handle reallocation
1243*4543ef51SXin LI  * failures correctly.  The prefix is exactly the right length to
1244*4543ef51SXin LI  * provoke particular uncommon code paths.
1245*4543ef51SXin LI  */
START_TEST(test_nsalloc_realloc_long_context_in_dtd)1246*4543ef51SXin LI START_TEST(test_nsalloc_realloc_long_context_in_dtd) {
1247*4543ef51SXin LI   const char *text1
1248*4543ef51SXin LI       = "<!DOCTYPE "
1249*4543ef51SXin LI         /* 64 characters per line */
1250*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1251*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1252*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1253*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1254*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1255*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1256*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1257*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1258*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1259*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1260*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1261*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1262*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1263*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1264*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1265*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1266*4543ef51SXin LI         ":doc [\n"
1267*4543ef51SXin LI         "  <!ENTITY First SYSTEM 'foo/First'>\n"
1268*4543ef51SXin LI         "]>\n"
1269*4543ef51SXin LI         "<"
1270*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1271*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1272*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1273*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1274*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1275*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1276*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1277*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1278*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1279*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1280*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1281*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1282*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1283*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1284*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1285*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1286*4543ef51SXin LI         ":doc xmlns:"
1287*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1288*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1289*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1290*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1291*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1292*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1293*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1294*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1295*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1296*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1297*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1298*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1299*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1300*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1301*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1302*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1303*4543ef51SXin LI         "='foo/Second'>&First;";
1304*4543ef51SXin LI   const char *text2
1305*4543ef51SXin LI       = "</"
1306*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1307*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1308*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1309*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1310*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1311*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1312*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1313*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1314*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1315*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1316*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1317*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1318*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1319*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1320*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1321*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1322*4543ef51SXin LI         ":doc>";
1323*4543ef51SXin LI   ExtOption options[] = {{XCS("foo/First"), "Hello world"}, {NULL, NULL}};
1324*4543ef51SXin LI   int i;
1325*4543ef51SXin LI   const int max_realloc_count = 20;
1326*4543ef51SXin LI 
1327*4543ef51SXin LI   for (i = 0; i < max_realloc_count; i++) {
1328*4543ef51SXin LI     g_reallocation_count = i;
1329*4543ef51SXin LI     XML_SetUserData(g_parser, options);
1330*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1331*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
1332*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
1333*4543ef51SXin LI             != XML_STATUS_ERROR
1334*4543ef51SXin LI         && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
1335*4543ef51SXin LI                                    XML_TRUE)
1336*4543ef51SXin LI                != XML_STATUS_ERROR)
1337*4543ef51SXin LI       break;
1338*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
1339*4543ef51SXin LI     nsalloc_teardown();
1340*4543ef51SXin LI     nsalloc_setup();
1341*4543ef51SXin LI   }
1342*4543ef51SXin LI   if (i == 0)
1343*4543ef51SXin LI     fail("Parsing worked despite failing reallocations");
1344*4543ef51SXin LI   else if (i == max_realloc_count)
1345*4543ef51SXin LI     fail("Parsing failed even at max reallocation count");
1346*4543ef51SXin LI }
1347*4543ef51SXin LI END_TEST
1348*4543ef51SXin LI 
START_TEST(test_nsalloc_long_default_in_ext)1349*4543ef51SXin LI START_TEST(test_nsalloc_long_default_in_ext) {
1350*4543ef51SXin LI   const char *text
1351*4543ef51SXin LI       = "<!DOCTYPE doc [\n"
1352*4543ef51SXin LI         "  <!ATTLIST e a1 CDATA '"
1353*4543ef51SXin LI         /* 64 characters per line */
1354*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1355*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1356*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1357*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1358*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1359*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1360*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1361*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1362*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1363*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1364*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1365*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1366*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1367*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1368*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1369*4543ef51SXin LI         "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
1370*4543ef51SXin LI         "'>\n"
1371*4543ef51SXin LI         "  <!ENTITY x SYSTEM 'foo'>\n"
1372*4543ef51SXin LI         "]>\n"
1373*4543ef51SXin LI         "<doc>&x;</doc>";
1374*4543ef51SXin LI   ExtOption options[] = {{XCS("foo"), "<e/>"}, {NULL, NULL}};
1375*4543ef51SXin LI   int i;
1376*4543ef51SXin LI   const int max_alloc_count = 50;
1377*4543ef51SXin LI 
1378*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
1379*4543ef51SXin LI     g_allocation_count = i;
1380*4543ef51SXin LI     XML_SetUserData(g_parser, options);
1381*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1382*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
1383*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1384*4543ef51SXin LI         != XML_STATUS_ERROR)
1385*4543ef51SXin LI       break;
1386*4543ef51SXin LI 
1387*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
1388*4543ef51SXin LI     nsalloc_teardown();
1389*4543ef51SXin LI     nsalloc_setup();
1390*4543ef51SXin LI   }
1391*4543ef51SXin LI   if (i == 0)
1392*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
1393*4543ef51SXin LI   else if (i == max_alloc_count)
1394*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
1395*4543ef51SXin LI }
1396*4543ef51SXin LI END_TEST
1397*4543ef51SXin LI 
START_TEST(test_nsalloc_long_systemid_in_ext)1398*4543ef51SXin LI START_TEST(test_nsalloc_long_systemid_in_ext) {
1399*4543ef51SXin LI   const char *text
1400*4543ef51SXin LI       = "<!DOCTYPE doc SYSTEM 'foo' [\n"
1401*4543ef51SXin LI         "  <!ENTITY en SYSTEM '"
1402*4543ef51SXin LI         /* 64 characters per line */
1403*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1404*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1405*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1406*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1407*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1408*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1409*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1410*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1411*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1412*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1413*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1414*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1415*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1416*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1417*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1418*4543ef51SXin LI         "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
1419*4543ef51SXin LI         "'>\n"
1420*4543ef51SXin LI         "]>\n"
1421*4543ef51SXin LI         "<doc>&en;</doc>";
1422*4543ef51SXin LI   ExtOption options[] = {
1423*4543ef51SXin LI       {XCS("foo"), "<!ELEMENT e EMPTY>"},
1424*4543ef51SXin LI       {/* clang-format off */
1425*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1426*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1427*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1428*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1429*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1430*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1431*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1432*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1433*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1434*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1435*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1436*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1437*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1438*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1439*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
1440*4543ef51SXin LI             XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"),
1441*4543ef51SXin LI        /* clang-format on */
1442*4543ef51SXin LI        "<e/>"},
1443*4543ef51SXin LI       {NULL, NULL}};
1444*4543ef51SXin LI   int i;
1445*4543ef51SXin LI   const int max_alloc_count = 55;
1446*4543ef51SXin LI 
1447*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
1448*4543ef51SXin LI     g_allocation_count = i;
1449*4543ef51SXin LI     XML_SetUserData(g_parser, options);
1450*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1451*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
1452*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1453*4543ef51SXin LI         != XML_STATUS_ERROR)
1454*4543ef51SXin LI       break;
1455*4543ef51SXin LI 
1456*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
1457*4543ef51SXin LI     nsalloc_teardown();
1458*4543ef51SXin LI     nsalloc_setup();
1459*4543ef51SXin LI   }
1460*4543ef51SXin LI   if (i == 0)
1461*4543ef51SXin LI     fail("Parsing worked despite failing allocations");
1462*4543ef51SXin LI   else if (i == max_alloc_count)
1463*4543ef51SXin LI     fail("Parsing failed even at max allocation count");
1464*4543ef51SXin LI }
1465*4543ef51SXin LI END_TEST
1466*4543ef51SXin LI 
1467*4543ef51SXin LI /* Test the effects of allocation failure on parsing an element in a
1468*4543ef51SXin LI  * namespace.  Based on test_nsalloc_long_context.
1469*4543ef51SXin LI  */
START_TEST(test_nsalloc_prefixed_element)1470*4543ef51SXin LI START_TEST(test_nsalloc_prefixed_element) {
1471*4543ef51SXin LI   const char *text = "<!DOCTYPE pfx:element SYSTEM 'foo' [\n"
1472*4543ef51SXin LI                      "  <!ATTLIST pfx:element baz ID #REQUIRED>\n"
1473*4543ef51SXin LI                      "  <!ENTITY en SYSTEM 'bar'>\n"
1474*4543ef51SXin LI                      "]>\n"
1475*4543ef51SXin LI                      "<pfx:element xmlns:pfx='http://example.org/' baz='2'>\n"
1476*4543ef51SXin LI                      "&en;"
1477*4543ef51SXin LI                      "</pfx:element>";
1478*4543ef51SXin LI   ExtOption options[] = {
1479*4543ef51SXin LI       {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
1480*4543ef51SXin LI   int i;
1481*4543ef51SXin LI   const int max_alloc_count = 70;
1482*4543ef51SXin LI 
1483*4543ef51SXin LI   for (i = 0; i < max_alloc_count; i++) {
1484*4543ef51SXin LI     g_allocation_count = i;
1485*4543ef51SXin LI     XML_SetUserData(g_parser, options);
1486*4543ef51SXin LI     XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1487*4543ef51SXin LI     XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
1488*4543ef51SXin LI     if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
1489*4543ef51SXin LI         != XML_STATUS_ERROR)
1490*4543ef51SXin LI       break;
1491*4543ef51SXin LI 
1492*4543ef51SXin LI     /* See comment in test_nsalloc_xmlns() */
1493*4543ef51SXin LI     nsalloc_teardown();
1494*4543ef51SXin LI     nsalloc_setup();
1495*4543ef51SXin LI   }
1496*4543ef51SXin LI   if (i == 0)
1497*4543ef51SXin LI     fail("Success despite failing allocator");
1498*4543ef51SXin LI   else if (i == max_alloc_count)
1499*4543ef51SXin LI     fail("Failed even at full allocation count");
1500*4543ef51SXin LI }
1501*4543ef51SXin LI END_TEST
1502*4543ef51SXin LI 
1503*4543ef51SXin LI void
make_nsalloc_test_case(Suite * s)1504*4543ef51SXin LI make_nsalloc_test_case(Suite *s) {
1505*4543ef51SXin LI   TCase *tc_nsalloc = tcase_create("namespace allocation tests");
1506*4543ef51SXin LI 
1507*4543ef51SXin LI   suite_add_tcase(s, tc_nsalloc);
1508*4543ef51SXin LI   tcase_add_checked_fixture(tc_nsalloc, nsalloc_setup, nsalloc_teardown);
1509*4543ef51SXin LI 
1510*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_xmlns);
1511*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_parse_buffer);
1512*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_prefix);
1513*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_uri);
1514*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_attr);
1515*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_attr_prefix);
1516*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_realloc_attributes);
1517*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_element);
1518*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_realloc_binding_uri);
1519*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_prefix);
1520*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_realloc_longer_prefix);
1521*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_namespace);
1522*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_less_long_namespace);
1523*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_context);
1524*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context);
1525*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_2);
1526*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_3);
1527*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_4);
1528*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_5);
1529*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_6);
1530*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_realloc_long_context_7);
1531*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_ge_name);
1532*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc,
1533*4543ef51SXin LI                             test_nsalloc_realloc_long_context_in_dtd);
1534*4543ef51SXin LI   tcase_add_test__if_xml_ge(tc_nsalloc, test_nsalloc_long_default_in_ext);
1535*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
1536*4543ef51SXin LI   tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
1537*4543ef51SXin LI }
1538