]> granicus.if.org Git - libexpat/commitdiff
Test a valid (if odd) encoding
authorRhodri James <rhodri@kynesim.co.uk>
Thu, 8 Jun 2017 18:02:54 +0000 (19:02 +0100)
committerSebastian Pipping <sebastian@pipping.org>
Sat, 22 Jul 2017 20:49:17 +0000 (22:49 +0200)
expat/tests/runtests.c

index ebe300cadf726bcc6819f854810b53de0870c89c..a00c5cf1068ac6512ae0f654e81b5e5d07733807 100644 (file)
@@ -5269,6 +5269,10 @@ END_TEST
 /* Test that the unknown encoding handler with map entries that expect
  * conversion but no conversion function is faulted
  */
+#define NO_CONVERTER      ((intptr_t)0)
+#define FAILING_CONVERTER ((intptr_t)1)
+#define PREFIX_CONVERTER  ((intptr_t)2)
+
 static int XMLCALL
 failing_converter(void *UNUSED_P(data), const char *UNUSED_P(s))
 {
@@ -5276,6 +5280,13 @@ failing_converter(void *UNUSED_P(data), const char *UNUSED_P(s))
     return -1;
 }
 
+static int XMLCALL
+prefix_converter(void *UNUSED_P(data), const char *s)
+{
+    /* Just add the low bits of the first byte to the second */
+    return s[1] + (s[0] & 0x7f);
+}
+
 static int XMLCALL
 BadEncodingHandler(void *data,
                    const XML_Char *UNUSED_P(encoding),
@@ -5288,8 +5299,20 @@ BadEncodingHandler(void *data,
     for (; i < 256; ++i)
         info->map[i] = -2; /* A 2-byte sequence */
     info->data = NULL;
-    info->convert = (data == NULL) ? NULL : failing_converter;
     info->release = NULL;
+    switch ((intptr_t)data) {
+        case FAILING_CONVERTER:
+            info->convert = failing_converter;
+            break;
+        case PREFIX_CONVERTER:
+            info->convert = prefix_converter;
+            break;
+        case NO_CONVERTER:
+            info->convert = NULL;
+            break;
+        default:
+            return XML_STATUS_ERROR;
+    }
     return XML_STATUS_OK;
 }
 
@@ -5299,7 +5322,8 @@ START_TEST(test_missing_encoding_conversion_fn)
         "<?xml version='1.0' encoding='experimental'?>\n"
         "<doc>\x81</doc>";
 
-    XML_SetUnknownEncodingHandler(parser, BadEncodingHandler, NULL);
+    XML_SetUnknownEncodingHandler(parser, BadEncodingHandler,
+                                  (void *)NO_CONVERTER);
     /* BadEncodingHandler sets up an encoding with every top-bit-set
      * character introducing a two-byte sequence.  For this, it
      * requires a convert function.  The above function call doesn't
@@ -5318,8 +5342,7 @@ START_TEST(test_failing_encoding_conversion_fn)
         "<doc>\x81</doc>";
 
     XML_SetUnknownEncodingHandler(parser, BadEncodingHandler,
-                                  /* Anything non-NULL will do here */
-                                  (void *)(intptr_t)1);
+                                  (void *)FAILING_CONVERTER);
     /* BadEncodingHandler sets up an encoding with every top-bit-set
      * character introducing a two-byte sequence.  For this, it
      * requires a convert function.  The above function call passes
@@ -5330,6 +5353,23 @@ START_TEST(test_failing_encoding_conversion_fn)
 }
 END_TEST
 
+/* Test unknown encoding conversions */
+START_TEST(test_unknown_encoding_success)
+{
+    const char *text =
+        "<?xml version='1.0' encoding='experimental'?>\n"
+        "<d\x80oc>Hello, world</d\x80oc>";
+
+    XML_SetUnknownEncodingHandler(parser, BadEncodingHandler,
+                                  (void *)PREFIX_CONVERTER);
+    run_character_check(text, "Hello, world");
+}
+END_TEST
+
+/* Be tidy */
+#undef NO_CONVERTER
+#undef FAILING_CONVERTER
+#undef PREFIX_CONVERTER
 
 /*
  * Namespaces tests.
@@ -10589,6 +10629,7 @@ make_suite(void)
     tcase_add_test(tc_basic, test_comment_handled_in_default);
     tcase_add_test(tc_basic, test_missing_encoding_conversion_fn);
     tcase_add_test(tc_basic, test_failing_encoding_conversion_fn);
+    tcase_add_test(tc_basic, test_unknown_encoding_success);
 
     suite_add_tcase(s, tc_namespace);
     tcase_add_checked_fixture(tc_namespace,