diff --git a/expat/tests/basic_tests.c b/expat/tests/basic_tests.c index e923b527..94def68a 100644 --- a/expat/tests/basic_tests.c +++ b/expat/tests/basic_tests.c @@ -2867,6 +2867,87 @@ START_TEST(test_ignore_section) { } END_TEST +START_TEST(test_ignore_section_utf16) { + const char text[] = + /* */ + "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 " + "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0" + /* &en; */ + "<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0"; + const XML_Char *expected = XCS("]]>\n&en;"); + CharData storage; + + CharData_Init(&storage); + XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetUserData(g_parser, &storage); + XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16); + XML_SetDefaultHandler(g_parser, accumulate_characters); + XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler); + XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler); + XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler); + XML_SetStartElementHandler(g_parser, dummy_start_element); + XML_SetEndElementHandler(g_parser, dummy_end_element); + if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE) + == XML_STATUS_ERROR) + xml_failure(g_parser); + CharData_CheckXMLChars(&storage, expected); +} +END_TEST + +START_TEST(test_ignore_section_utf16_be) { + const char text[] = + /* */ + "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 " + "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n" + /* &en; */ + "\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>"; + const XML_Char *expected = XCS("]]>\n&en;"); + CharData storage; + + CharData_Init(&storage); + XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetUserData(g_parser, &storage); + XML_SetExternalEntityRefHandler(g_parser, + external_entity_load_ignore_utf16_be); + XML_SetDefaultHandler(g_parser, accumulate_characters); + XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler); + XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler); + XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler); + XML_SetStartElementHandler(g_parser, dummy_start_element); + XML_SetEndElementHandler(g_parser, dummy_end_element); + if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE) + == XML_STATUS_ERROR) + xml_failure(g_parser); + CharData_CheckXMLChars(&storage, expected); +} +END_TEST + +/* Test mis-formatted conditional exclusion */ +START_TEST(test_bad_ignore_section) { + const char *text = "\n" + "&entity;"; + ExtFaults faults[] + = {{"", "Invalid XML character not faulted", NULL, + XML_ERROR_INVALID_TOKEN}, + {/* FIrst two bytes of a three-byte char */ + "parse_text != NULL; fault++) { + XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter); + XML_SetUserData(g_parser, fault); + expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING, + "Incomplete IGNORE section not failed"); + XML_ParserReset(g_parser, NULL); + } +} +END_TEST + TCase * make_basic_test_case(Suite *s) { TCase *tc_basic = tcase_create("basic tests"); @@ -2994,6 +3075,9 @@ make_basic_test_case(Suite *s) { tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd); tcase_add_test(tc_basic, test_not_predefined_entities); tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section); + tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16); + tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be); + tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section); return tc_basic; /* TEMPORARY: this will become a void function */ } diff --git a/expat/tests/handlers.c b/expat/tests/handlers.c index 8ea8491e..34e9ee3f 100644 --- a/expat/tests/handlers.c +++ b/expat/tests/handlers.c @@ -675,6 +675,58 @@ external_entity_load_ignore(XML_Parser parser, const XML_Char *context, return XML_STATUS_OK; } +int XMLCALL +external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) { + const char text[] = + /* ]]> */ + "<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0" + "<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0" + "(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0"; + XML_Parser ext_parser; + + UNUSED_P(base); + UNUSED_P(systemId); + UNUSED_P(publicId); + ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL); + if (ext_parser == NULL) + fail("Could not create external entity parser"); + if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE) + == XML_STATUS_ERROR) + xml_failure(parser); + + XML_ParserFree(ext_parser); + return XML_STATUS_OK; +} + +int XMLCALL +external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) { + const char text[] = + /* ]]> */ + "\0<\0!\0[\0I\0G\0N\0O\0R\0E\0[" + "\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 " + "\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>"; + XML_Parser ext_parser; + + UNUSED_P(base); + UNUSED_P(systemId); + UNUSED_P(publicId); + ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL); + if (ext_parser == NULL) + fail("Could not create external entity parser"); + if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE) + == XML_STATUS_ERROR) + xml_failure(parser); + + XML_ParserFree(ext_parser); + return XML_STATUS_OK; +} + /* NotStandalone handlers */ int XMLCALL diff --git a/expat/tests/handlers.h b/expat/tests/handlers.h index b0d5233f..57d19e3e 100644 --- a/expat/tests/handlers.h +++ b/expat/tests/handlers.h @@ -226,6 +226,16 @@ extern int XMLCALL external_entity_load_ignore(XML_Parser parser, const XML_Char *systemId, const XML_Char *publicId); +extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +extern int XMLCALL external_entity_load_ignore_utf16_be( + XML_Parser parser, const XML_Char *context, const XML_Char *base, + const XML_Char *systemId, const XML_Char *publicId); + /* NotStandalone handlers */ extern int XMLCALL reject_not_standalone_handler(void *userData); diff --git a/expat/tests/runtests.c b/expat/tests/runtests.c index 1d11c5c2..92a89707 100644 --- a/expat/tests/runtests.c +++ b/expat/tests/runtests.c @@ -74,139 +74,6 @@ XML_Parser g_parser = NULL; -static int XMLCALL -external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) { - const char text[] = - /* ]]> */ - "<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0" - "<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0" - "(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0"; - XML_Parser ext_parser; - - UNUSED_P(base); - UNUSED_P(systemId); - UNUSED_P(publicId); - ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL); - if (ext_parser == NULL) - fail("Could not create external entity parser"); - if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE) - == XML_STATUS_ERROR) - xml_failure(parser); - - XML_ParserFree(ext_parser); - return XML_STATUS_OK; -} - -START_TEST(test_ignore_section_utf16) { - const char text[] = - /* */ - "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 " - "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0" - /* &en; */ - "<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0"; - const XML_Char *expected = XCS("]]>\n&en;"); - CharData storage; - - CharData_Init(&storage); - XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); - XML_SetUserData(g_parser, &storage); - XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16); - XML_SetDefaultHandler(g_parser, accumulate_characters); - XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler); - XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler); - XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler); - XML_SetStartElementHandler(g_parser, dummy_start_element); - XML_SetEndElementHandler(g_parser, dummy_end_element); - if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE) - == XML_STATUS_ERROR) - xml_failure(g_parser); - CharData_CheckXMLChars(&storage, expected); -} -END_TEST - -static int XMLCALL -external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) { - const char text[] = - /* ]]> */ - "\0<\0!\0[\0I\0G\0N\0O\0R\0E\0[" - "\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 " - "\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>"; - XML_Parser ext_parser; - - UNUSED_P(base); - UNUSED_P(systemId); - UNUSED_P(publicId); - ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL); - if (ext_parser == NULL) - fail("Could not create external entity parser"); - if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE) - == XML_STATUS_ERROR) - xml_failure(parser); - - XML_ParserFree(ext_parser); - return XML_STATUS_OK; -} - -START_TEST(test_ignore_section_utf16_be) { - const char text[] = - /* */ - "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 " - "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n" - /* &en; */ - "\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>"; - const XML_Char *expected = XCS("]]>\n&en;"); - CharData storage; - - CharData_Init(&storage); - XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); - XML_SetUserData(g_parser, &storage); - XML_SetExternalEntityRefHandler(g_parser, - external_entity_load_ignore_utf16_be); - XML_SetDefaultHandler(g_parser, accumulate_characters); - XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler); - XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler); - XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler); - XML_SetStartElementHandler(g_parser, dummy_start_element); - XML_SetEndElementHandler(g_parser, dummy_end_element); - if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE) - == XML_STATUS_ERROR) - xml_failure(g_parser); - CharData_CheckXMLChars(&storage, expected); -} -END_TEST - -/* Test mis-formatted conditional exclusion */ -START_TEST(test_bad_ignore_section) { - const char *text = "\n" - "&entity;"; - ExtFaults faults[] - = {{"", "Invalid XML character not faulted", NULL, - XML_ERROR_INVALID_TOKEN}, - {/* FIrst two bytes of a three-byte char */ - "parse_text != NULL; fault++) { - XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS); - XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter); - XML_SetUserData(g_parser, fault); - expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING, - "Incomplete IGNORE section not failed"); - XML_ParserReset(g_parser, NULL); - } -} -END_TEST - /* Test recursive parsing */ static int XMLCALL external_entity_valuer(XML_Parser parser, const XML_Char *context, @@ -7951,9 +7818,6 @@ make_suite(void) { TCase *tc_accounting = tcase_create("accounting tests"); #endif - tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16); - tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be); - tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section); tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values); tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone); tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);