output: Fix XML parsing in output_get_text_from_markup().
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 1 Jan 2019 17:08:44 +0000 (09:08 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 1 Jan 2019 17:08:53 +0000 (09:08 -0800)
The XML parser requires the entire input to be enclosed in an element.

src/output/driver.c

index c9c54ca0e66b01490ff8d36333d7cc5e6c1a50df..8b5a66249d6a4b54e902468dc7319249110bf008 100644 (file)
@@ -548,18 +548,21 @@ output_driver_parse_option (const char *option, struct string_map *options)
 char *
 output_get_text_from_markup (const char *markup)
 {
-  xmlDoc *doc = xmlReadMemory (markup, strlen (markup), "noname.xml", "UTF-8",
-                               (XML_PARSE_NOERROR | XML_PARSE_NOWARNING
-                                | XML_PARSE_NONET | XML_PARSE_NOCDATA));
-  if (!doc)
+  xmlParserCtxt *parser = xmlCreatePushParserCtxt (NULL, NULL, NULL, 0, NULL);
+  if (!parser)
     return xstrdup (markup);
 
-  char *content = CHAR_CAST (char *,
-                             xmlNodeGetContent (xmlDocGetRootElement (doc)));
-  if (!content)
-    content = xstrdup (markup);
-
-  xmlFreeDoc (doc);
+  xmlParseChunk (parser, "<xml>", strlen ("<xml>"), false);
+  xmlParseChunk (parser, markup, strlen (markup), false);
+  xmlParseChunk (parser, "</xml>", strlen ("</xml>"), true);
+
+  char *content
+    = (parser->wellFormed
+       ? CHAR_CAST (char *,
+                    xmlNodeGetContent (xmlDocGetRootElement (parser->myDoc)))
+       : xstrdup (markup));
+  xmlFreeDoc (parser->myDoc);
+  xmlFreeParserCtxt (parser);
 
   return content;
 }