From: Sean Bright Date: Tue, 9 May 2023 13:27:33 +0000 (-0400) Subject: xml.c: Process XML Inclusions recursively. X-Git-Tag: 18.19.0-rc1~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a33eecfb41923b3c327eb2291eaebbe23a3c725b;p=thirdparty%2Fasterisk.git xml.c: Process XML Inclusions recursively. 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 (cherry picked from commit 573bdbe92416d2055e526f520bb9647c7b4f3925) --- 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; }