diff options
author | fdrake <fdrake> | 2006-07-01 15:01:00 +0000 |
---|---|---|
committer | fdrake <fdrake> | 2006-07-01 15:01:00 +0000 |
commit | 017a4cbd7ee2aeb22a3e1c41f0f6f85917613ca6 (patch) | |
tree | f32c278e307d9e924f07ecd31893d5967c8c9b53 /tests | |
parent | ef3eed724310383dae9fbfa4cd3391b01130db85 (diff) | |
download | libexpat-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.c | 54 |
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, |