summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2020-09-20 15:14:47 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2020-09-20 16:22:03 +0200
commit4ccc06b56b8b6d39c29932c92cd1ed82f6698d6f (patch)
tree59c1965f9bc72bfd7aa2f0468c6693a4de224f96
parent5b822f63692c02a09fd6bf993c2e4788b8b07355 (diff)
downloadlibxslt-4ccc06b56b8b6d39c29932c92cd1ed82f6698d6f.tar.gz
Fix quadratic runtime with text and <xsl:message>
Backup and restore "last text" data in xsltEvalTemplateString. Otherwise, optimization of string concatenation would be disabled whenever an xsl:message was processed. Found by OSS-Fuzz.
-rw-r--r--libxslt/templates.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/libxslt/templates.c b/libxslt/templates.c
index 48b73a53..4108ed26 100644
--- a/libxslt/templates.c
+++ b/libxslt/templates.c
@@ -210,6 +210,8 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt,
{
xmlNodePtr oldInsert, insert = NULL;
xmlChar *ret;
+ const xmlChar *oldLastText;
+ int oldLastTextSize, oldLastTextUse;
if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) ||
(inst->type != XML_ELEMENT_NODE))
@@ -233,12 +235,18 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt,
}
oldInsert = ctxt->insert;
ctxt->insert = insert;
+ oldLastText = ctxt->lasttext;
+ oldLastTextSize = ctxt->lasttsize;
+ oldLastTextUse = ctxt->lasttuse;
/*
* OPTIMIZE TODO: if inst->children consists only of text-nodes.
*/
xsltApplyOneTemplate(ctxt, contextNode, inst->children, NULL, NULL);
ctxt->insert = oldInsert;
+ ctxt->lasttext = oldLastText;
+ ctxt->lasttsize = oldLastTextSize;
+ ctxt->lasttuse = oldLastTextUse;
ret = xmlNodeGetContent(insert);
if (insert != NULL)