]> granicus.if.org Git - libexpat/commitdiff
Test CDATA is passed correctly from little-endian UTF-16 input
authorRhodri James <rhodri@kynesim.co.uk>
Mon, 19 Jun 2017 15:10:04 +0000 (16:10 +0100)
committerSebastian Pipping <sebastian@pipping.org>
Sat, 22 Jul 2017 20:49:21 +0000 (22:49 +0200)
expat/tests/runtests.c

index 4beb4fa846a73c28dc55e2dcc042d1f01ab61c8a..a02ce88475b987fedeccbdc544caadf6571285ce 100644 (file)
@@ -2189,6 +2189,31 @@ START_TEST(test_good_cdata_utf16)
 }
 END_TEST
 
+START_TEST(test_good_cdata_utf16_le)
+{
+    /* Test data is:
+     *   <?xml version='1.0' encoding='utf-16'?>
+     *   <a><![CDATA[hello]]></a>
+     */
+    const char text[] =
+            "<\0?\0x\0m\0l\0"
+                " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
+                " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0""1\0""6\0'"
+                "\0?\0>\0\n"
+            "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>\0";
+    const char *expected = "hello";
+
+    CharData storage;
+    CharData_Init(&storage);
+    XML_SetUserData(parser, &storage);
+    XML_SetCharacterDataHandler(parser, accumulate_characters);
+
+    if (_XML_Parse_SINGLE_BYTES(parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
+        xml_failure(parser);
+    CharData_CheckXMLChars(&storage, expected);
+}
+END_TEST
+
 /* Test UTF16 conversion of a long cdata string */
 
 /* 16 characters: handy macro to reduce visual clutter */
@@ -11836,6 +11861,7 @@ make_suite(void)
     tcase_add_test(tc_basic, test_repeated_stop_parser_between_char_data_calls);
     tcase_add_test(tc_basic, test_good_cdata_ascii);
     tcase_add_test(tc_basic, test_good_cdata_utf16);
+    tcase_add_test(tc_basic, test_good_cdata_utf16_le);
     tcase_add_test(tc_basic, test_long_cdata_utf16);
     tcase_add_test(tc_basic, test_multichar_cdata_utf16);
     tcase_add_test(tc_basic, test_utf16_bad_surrogate_pair);