xml.c: Process XML Inclusions recursively.

If processing an XInclude results in new <xi:include> elements, we
need to run XInclude processing again. This continues until no
replacement occurs or an error is encountered.

There is a separate issue with dynamic strings (ast_str) that will be
addressed separately.

Resolves: #65
(cherry picked from commit 573bdbe924)
pull/310/head
Sean Bright 2 years ago committed by Asterisk Development Team
parent 44f7d62f02
commit a33eecfb41

@ -68,6 +68,29 @@ int ast_xml_finish(void)
return 0; return 0;
} }
/*!
* \internal
* \brief Process XML Inclusions (XInclude).
*
* XIncludes can result in new includes being inserted, so we need to reprocess
* until no changes are made or we encounter an error.
*
* \param doc the document to process
*
* \retval 0 if XInclude processing concluded successfully
* \retval -1 if an error occurred during XInclude processing
*/
static int process_xincludes(xmlDoc *doc)
{
int res;
do {
res = xmlXIncludeProcess(doc);
} while (res > 0);
return res;
}
struct ast_xml_doc *ast_xml_open(char *filename) struct ast_xml_doc *ast_xml_open(char *filename)
{ {
xmlDoc *doc; xmlDoc *doc;
@ -84,7 +107,7 @@ struct ast_xml_doc *ast_xml_open(char *filename)
} }
/* process xinclude elements. */ /* process xinclude elements. */
if (xmlXIncludeProcess(doc) < 0) { if (process_xincludes(doc) < 0) {
xmlFreeDoc(doc); xmlFreeDoc(doc);
return NULL; return NULL;
} }
@ -178,7 +201,7 @@ struct ast_xml_doc *ast_xml_read_memory(char *buffer, size_t size)
if (!(doc = xmlParseMemory(buffer, (int) size))) { if (!(doc = xmlParseMemory(buffer, (int) size))) {
/* process xinclude elements. */ /* process xinclude elements. */
if (xmlXIncludeProcess(doc) < 0) { if (process_xincludes(doc) < 0) {
xmlFreeDoc(doc); xmlFreeDoc(doc);
return NULL; return NULL;
} }
@ -489,7 +512,7 @@ struct ast_xslt_doc *ast_xslt_open(char *filename)
return NULL; return NULL;
} }
if (xmlXIncludeProcess(xml) < 0) { if (process_xincludes(xml) < 0) {
xmlFreeDoc(xml); xmlFreeDoc(xml);
return NULL; return NULL;
} }
@ -518,7 +541,7 @@ struct ast_xslt_doc *ast_xslt_read_memory(char *buffer, size_t size)
return NULL; return NULL;
} }
if (xmlXIncludeProcess(doc) < 0) { if (process_xincludes(doc) < 0) {
xmlFreeDoc(doc); xmlFreeDoc(doc);
return NULL; return NULL;
} }

Loading…
Cancel
Save