From d59a8ef59e926dd621f762b0c96551edfd381abf Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Thu, 11 May 2023 15:03:33 -0400 Subject: [PATCH] xml.c: Process XML Inclusions recursively. (#69) If processing an XInclude results in new 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 --- main/xml.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/main/xml.c b/main/xml.c index 8c49a9efc7..58003d63de 100644 --- a/main/xml.c +++ b/main/xml.c @@ -68,6 +68,29 @@ int ast_xml_finish(void) 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) { xmlDoc *doc; @@ -84,7 +107,7 @@ struct ast_xml_doc *ast_xml_open(char *filename) } /* process xinclude elements. */ - if (xmlXIncludeProcess(doc) < 0) { + if (process_xincludes(doc) < 0) { xmlFreeDoc(doc); 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))) { /* process xinclude elements. */ - if (xmlXIncludeProcess(doc) < 0) { + if (process_xincludes(doc) < 0) { xmlFreeDoc(doc); return NULL; } @@ -489,7 +512,7 @@ struct ast_xslt_doc *ast_xslt_open(char *filename) return NULL; } - if (xmlXIncludeProcess(xml) < 0) { + if (process_xincludes(xml) < 0) { xmlFreeDoc(xml); return NULL; } @@ -518,7 +541,7 @@ struct ast_xslt_doc *ast_xslt_read_memory(char *buffer, size_t size) return NULL; } - if (xmlXIncludeProcess(doc) < 0) { + if (process_xincludes(doc) < 0) { xmlFreeDoc(doc); return NULL; } -- 2.47.2