diff --git a/expat/tests/basic_tests.c b/expat/tests/basic_tests.c
index bbfd4441..d0f9dbb4 100644
--- a/expat/tests/basic_tests.c
+++ b/expat/tests/basic_tests.c
@@ -3340,6 +3340,117 @@ START_TEST(test_partial_char_in_epilog) {
}
END_TEST
+/* Test resuming a parse suspended in entity substitution */
+START_TEST(test_suspend_resume_internal_entity) {
+ const char *text
+ = "HiHo'>\n"
+ "]>\n"
+ "&foo;\n";
+ const XML_Char *expected1 = XCS("Hi");
+ const XML_Char *expected2 = XCS("HiHo");
+ CharData storage;
+
+ CharData_Init(&storage);
+ XML_SetStartElementHandler(g_parser, start_element_suspender);
+ XML_SetCharacterDataHandler(g_parser, accumulate_characters);
+ XML_SetUserData(g_parser, &storage);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, XCS(""));
+ if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected1);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
+ xml_failure(g_parser);
+ CharData_CheckXMLChars(&storage, expected2);
+}
+END_TEST
+
+START_TEST(test_suspend_resume_internal_entity_issue_629) {
+ const char *const text
+ = "a'>]>&e;\n"
+ "<"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "/>"
+ "";
+ const size_t firstChunkSizeBytes = 54;
+
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetUserData(parser, parser);
+ XML_SetCommentHandler(parser, suspending_comment_handler);
+
+ if (XML_Parse(parser, text, (int)firstChunkSizeBytes, XML_FALSE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(parser);
+ if (XML_ResumeParser(parser) != XML_STATUS_OK)
+ xml_failure(parser);
+ if (XML_Parse(parser, text + firstChunkSizeBytes,
+ (int)(strlen(text) - firstChunkSizeBytes), XML_TRUE)
+ != XML_STATUS_OK)
+ xml_failure(parser);
+ XML_ParserFree(parser);
+}
+END_TEST
+
+/* Test syntax error is caught at parse resumption */
+START_TEST(test_resume_entity_with_syntax_error) {
+ const char *text = "Hi'>\n"
+ "]>\n"
+ "&foo;\n";
+
+ XML_SetStartElementHandler(g_parser, start_element_suspender);
+ if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
+ != XML_STATUS_SUSPENDED)
+ xml_failure(g_parser);
+ if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
+ fail("Syntax error in entity not faulted");
+ if (XML_GetErrorCode(g_parser) != XML_ERROR_TAG_MISMATCH)
+ xml_failure(g_parser);
+}
+END_TEST
+
TCase *
make_basic_test_case(Suite *s) {
TCase *tc_basic = tcase_create("basic tests");
@@ -3492,6 +3603,10 @@ make_basic_test_case(Suite *s) {
tcase_add_test(tc_basic, test_suspend_in_sole_empty_tag);
tcase_add_test(tc_basic, test_unfinished_epilog);
tcase_add_test(tc_basic, test_partial_char_in_epilog);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
+ tcase_add_test__ifdef_xml_dtd(tc_basic,
+ test_suspend_resume_internal_entity_issue_629);
+ tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
return tc_basic; /* TEMPORARY: this will become a void function */
}
diff --git a/expat/tests/handlers.c b/expat/tests/handlers.c
index 0537e33d..4ddbbf9c 100644
--- a/expat/tests/handlers.c
+++ b/expat/tests/handlers.c
@@ -158,6 +158,17 @@ suspending_end_handler(void *userData, const XML_Char *s) {
XML_StopParser((XML_Parser)userData, 1);
}
+void XMLCALL
+start_element_suspender(void *userData, const XML_Char *name,
+ const XML_Char **atts) {
+ UNUSED_P(userData);
+ UNUSED_P(atts);
+ if (! xcstrcmp(name, XCS("suspend")))
+ XML_StopParser(g_parser, XML_TRUE);
+ if (! xcstrcmp(name, XCS("abort")))
+ XML_StopParser(g_parser, XML_FALSE);
+}
+
/* Text encoding handlers */
int XMLCALL
@@ -1162,3 +1173,10 @@ selective_aborting_default_handler(void *userData, const XML_Char *s, int len) {
XML_SetDefaultHandler(g_parser, NULL);
}
}
+
+void XMLCALL
+suspending_comment_handler(void *userData, const XML_Char *data) {
+ UNUSED_P(data);
+ XML_Parser parser = (XML_Parser)userData;
+ XML_StopParser(parser, XML_TRUE);
+}
diff --git a/expat/tests/handlers.h b/expat/tests/handlers.h
index e70aba31..8537270a 100644
--- a/expat/tests/handlers.h
+++ b/expat/tests/handlers.h
@@ -95,6 +95,10 @@ extern void XMLCALL counting_start_element_handler(void *userData,
extern void XMLCALL suspending_end_handler(void *userData, const XML_Char *s);
+extern void XMLCALL start_element_suspender(void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
/* Text encoding handlers */
extern int XMLCALL UnknownEncodingHandler(void *data, const XML_Char *encoding,
@@ -363,6 +367,9 @@ extern void XMLCALL selective_aborting_default_handler(void *userData,
const XML_Char *s,
int len);
+extern void XMLCALL suspending_comment_handler(void *userData,
+ const XML_Char *data);
+
#endif /* XML_HANDLERS_H */
#ifdef __cplusplus
diff --git a/expat/tests/runtests.c b/expat/tests/runtests.c
index 23393d43..cb354a14 100644
--- a/expat/tests/runtests.c
+++ b/expat/tests/runtests.c
@@ -74,135 +74,6 @@
XML_Parser g_parser = NULL;
-/* Test resuming a parse suspended in entity substitution */
-static void XMLCALL
-start_element_suspender(void *userData, const XML_Char *name,
- const XML_Char **atts) {
- UNUSED_P(userData);
- UNUSED_P(atts);
- if (! xcstrcmp(name, XCS("suspend")))
- XML_StopParser(g_parser, XML_TRUE);
- if (! xcstrcmp(name, XCS("abort")))
- XML_StopParser(g_parser, XML_FALSE);
-}
-
-START_TEST(test_suspend_resume_internal_entity) {
- const char *text
- = "HiHo'>\n"
- "]>\n"
- "&foo;\n";
- const XML_Char *expected1 = XCS("Hi");
- const XML_Char *expected2 = XCS("HiHo");
- CharData storage;
-
- CharData_Init(&storage);
- XML_SetStartElementHandler(g_parser, start_element_suspender);
- XML_SetCharacterDataHandler(g_parser, accumulate_characters);
- XML_SetUserData(g_parser, &storage);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, XCS(""));
- if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected1);
- if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
- xml_failure(g_parser);
- CharData_CheckXMLChars(&storage, expected2);
-}
-END_TEST
-
-static void XMLCALL
-suspending_comment_handler(void *userData, const XML_Char *data) {
- UNUSED_P(data);
- XML_Parser parser = (XML_Parser)userData;
- XML_StopParser(parser, XML_TRUE);
-}
-
-START_TEST(test_suspend_resume_internal_entity_issue_629) {
- const char *const text
- = "a'>]>&e;\n"
- "<"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "/>"
- "";
- const size_t firstChunkSizeBytes = 54;
-
- XML_Parser parser = XML_ParserCreate(NULL);
- XML_SetUserData(parser, parser);
- XML_SetCommentHandler(parser, suspending_comment_handler);
-
- if (XML_Parse(parser, text, (int)firstChunkSizeBytes, XML_FALSE)
- != XML_STATUS_SUSPENDED)
- xml_failure(parser);
- if (XML_ResumeParser(parser) != XML_STATUS_OK)
- xml_failure(parser);
- if (XML_Parse(parser, text + firstChunkSizeBytes,
- (int)(strlen(text) - firstChunkSizeBytes), XML_TRUE)
- != XML_STATUS_OK)
- xml_failure(parser);
- XML_ParserFree(parser);
-}
-END_TEST
-
-/* Test syntax error is caught at parse resumption */
-START_TEST(test_resume_entity_with_syntax_error) {
- const char *text = "Hi'>\n"
- "]>\n"
- "&foo;\n";
-
- XML_SetStartElementHandler(g_parser, start_element_suspender);
- if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
- != XML_STATUS_SUSPENDED)
- xml_failure(g_parser);
- if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
- fail("Syntax error in entity not faulted");
- if (XML_GetErrorCode(g_parser) != XML_ERROR_TAG_MISMATCH)
- xml_failure(g_parser);
-}
-END_TEST
-
/* Test suspending and resuming in a parameter entity substitution */
static void XMLCALL
element_decl_suspender(void *userData, const XML_Char *name,
@@ -7216,10 +7087,6 @@ make_suite(void) {
TCase *tc_accounting = tcase_create("accounting tests");
#endif
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
- tcase_add_test__ifdef_xml_dtd(tc_basic,
- test_suspend_resume_internal_entity_issue_629);
- tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_parameter_entity);
tcase_add_test(tc_basic, test_restart_on_error);
tcase_add_test(tc_basic, test_reject_lt_in_attribute_value);