From 53e1698aa3d23c6de39ea7a3f30ca417c6d343e8 Mon Sep 17 00:00:00 2001 From: Rhodri James Date: Fri, 17 Feb 2017 18:58:08 +0000 Subject: [PATCH] Add test case for long URIs in attributes with failing allocator --- expat/tests/runtests.c | 76 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/expat/tests/runtests.c b/expat/tests/runtests.c index 1011510e..d971cbe6 100644 --- a/expat/tests/runtests.c +++ b/expat/tests/runtests.c @@ -4505,6 +4505,81 @@ START_TEST(test_nsalloc_long_prefix) #undef MAX_ALLOC_COUNT END_TEST +/* Check handling of long uri names (pool growth) */ +START_TEST(test_nsalloc_long_uri) +{ + const char *text = + "" + ""; + int i; +#define MAX_ALLOC_COUNT 15 + int repeated = 0; + + for (i = 0; i < MAX_ALLOC_COUNT; i++) { + /* Repeat some tests with the same allocation count to + * catch cached allocations not freed by XML_ParserReset() + */ + if ((i == 3 && repeated == 1) || + (i == 6 && repeated == 4)) { + i -= 2; + repeated++; + } + else if ((i == 2 && (repeated == 0 || repeated == 2)) || + (i == 4 && repeated == 3) || + (i == 8 && repeated == 5)) { + i--; + repeated++; + } + allocation_count = i; + if (_XML_Parse_SINGLE_BYTES(parser, text, strlen(text), + XML_TRUE) != XML_STATUS_ERROR) + break; + XML_ParserReset(parser, NULL); + } + if (i == 0) + fail("Parsing worked despite failing allocations"); + else if (i == MAX_ALLOC_COUNT) + fail("Parsing failed even at max allocation count"); +} +#undef MAX_ALLOC_COUNT +END_TEST + /* Test attribute handling in the face of a dodgy reallocator */ START_TEST(test_nsalloc_realloc_attributes) { @@ -4678,6 +4753,7 @@ make_suite(void) tcase_add_test(tc_nsalloc, test_nsalloc_xmlns); tcase_add_test(tc_nsalloc, test_nsalloc_parse_buffer); tcase_add_test(tc_nsalloc, test_nsalloc_long_prefix); + tcase_add_test(tc_nsalloc, test_nsalloc_long_uri); tcase_add_test(tc_nsalloc, test_nsalloc_realloc_attributes); return s;