summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorfdrake <fdrake>2006-07-01 15:01:00 +0000
committerfdrake <fdrake>2006-07-01 15:01:00 +0000
commit017a4cbd7ee2aeb22a3e1c41f0f6f85917613ca6 (patch)
treef32c278e307d9e924f07ecd31893d5967c8c9b53 /tests
parentef3eed724310383dae9fbfa4cd3391b01130db85 (diff)
downloadlibexpat-017a4cbd7ee2aeb22a3e1c41f0f6f85917613ca6.tar.gz
SF bug #1515266: missing check of stopped parser in doContext() for loop
(added regression test, closing bug report)
Diffstat (limited to 'tests')
-rw-r--r--tests/runtests.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/runtests.c b/tests/runtests.c
index 68ccdcc..23b92ad 100644
--- a/tests/runtests.c
+++ b/tests/runtests.c
@@ -983,6 +983,59 @@ START_TEST(test_ns_in_attribute_default_without_namespaces)
END_TEST
+static void
+self_clearing_aborting_character_handler(void *userData,
+ const XML_Char *s,
+ int len)
+{
+ XML_StopParser(parser, XML_FALSE);
+ XML_SetCharacterDataHandler(parser, NULL);
+}
+
+/* Regression test for SF bug #1515266: missing check of stopped
+ parser in doContext() 'for' loop. */
+START_TEST(test_stop_parser_between_char_data_calls)
+{
+ /* The sample data must be big enough that there are two calls to
+ the character data handler from within the inner "for" loop of
+ the XML_TOK_DATA_CHARS case in doContent(), and the character
+ handler must stop the parser and clear the character data
+ handler.
+ */
+ char *text =
+ "<?xml version='1.0' encoding='iso-8859-1'?><s>"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "012345678901234567890123456789012345678901234567890123456789"
+ "</s>";
+
+ XML_SetCharacterDataHandler(parser,
+ self_clearing_aborting_character_handler);
+ if (XML_Parse(parser, text, strlen(text), XML_TRUE) != XML_STATUS_ERROR)
+ xml_failure(parser);
+ if (XML_GetErrorCode(parser) != XML_ERROR_ABORTED)
+ xml_failure(parser);
+}
+END_TEST
+
+
/*
* Namespaces tests.
*/
@@ -1380,6 +1433,7 @@ make_suite(void)
tcase_add_test(tc_basic, test_dtd_default_handling);
tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
+ tcase_add_test(tc_basic, test_stop_parser_between_char_data_calls);
suite_add_tcase(s, tc_namespace);
tcase_add_checked_fixture(tc_namespace,