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