| libxslt-1.1.32: Fix handling of RVTs returned from nested EXSLT functions |
| |
| [No upstream tracking] -- https://bugzilla.gnome.org/show_bug.cgi?id=792580 |
| |
| Set the context variable to NULL when evaluating EXSLT functions. |
| Fixes potential use-after-free errors or memory leaks. |
| |
| Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/libxslt/commit/8bd32f7753ac253a54279a0b6a88d15a57076bb0] |
| bug: 792580 |
| Signed-off-by: Andrej Valek <andrej.valek@siemens.com> |
| |
| diff --git a/libexslt/functions.c b/libexslt/functions.c |
| index dc794e3..8511cb0 100644 |
| --- a/libexslt/functions.c |
| +++ b/libexslt/functions.c |
| @@ -280,6 +280,7 @@ exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) { |
| exsltFuncFunctionData *func; |
| xmlNodePtr paramNode, oldInsert, fake; |
| int oldBase; |
| + void *oldCtxtVar; |
| xsltStackElemPtr params = NULL, param; |
| xsltTransformContextPtr tctxt = xsltXPathGetTransformContext(ctxt); |
| int i, notSet; |
| @@ -418,11 +419,14 @@ exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) { |
| fake = xmlNewDocNode(tctxt->output, NULL, |
| (const xmlChar *)"fake", NULL); |
| oldInsert = tctxt->insert; |
| + oldCtxtVar = tctxt->contextVariable; |
| tctxt->insert = fake; |
| + tctxt->contextVariable = NULL; |
| xsltApplyOneTemplate (tctxt, tctxt->node, |
| func->content, NULL, NULL); |
| xsltLocalVariablePop(tctxt, tctxt->varsBase, -2); |
| tctxt->insert = oldInsert; |
| + tctxt->contextVariable = oldCtxtVar; |
| tctxt->varsBase = oldBase; /* restore original scope */ |
| if (params != NULL) |
| xsltFreeStackElemList(params); |
| diff --git a/tests/docs/bug-209.xml b/tests/docs/bug-209.xml |
| new file mode 100644 |
| index 0000000..69d62f2 |
| --- /dev/null |
| +++ b/tests/docs/bug-209.xml |
| @@ -0,0 +1 @@ |
| +<doc/> |
| diff --git a/tests/general/bug-209.out b/tests/general/bug-209.out |
| new file mode 100644 |
| index 0000000..e829790 |
| --- /dev/null |
| +++ b/tests/general/bug-209.out |
| @@ -0,0 +1,2 @@ |
| +<?xml version="1.0"?> |
| +<result/> |
| diff --git a/tests/general/bug-209.xsl b/tests/general/bug-209.xsl |
| new file mode 100644 |
| index 0000000..fe69ac6 |
| --- /dev/null |
| +++ b/tests/general/bug-209.xsl |
| @@ -0,0 +1,21 @@ |
| +<xsl:stylesheet |
| + version="1.0" |
| + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| + xmlns:func="http://exslt.org/functions" |
| + extension-element-prefixes="func"> |
| + |
| + <xsl:template match="/"> |
| + <xsl:variable name="v" select="func:a()" /> |
| + <xsl:copy-of select="$v"/> |
| + </xsl:template> |
| + |
| + <func:function name="func:a"> |
| + <func:result select="func:b()" /> |
| + </func:function> |
| + |
| + <func:function name="func:b"> |
| + <func:result> |
| + <result/> |
| + </func:result> |
| + </func:function> |
| +</xsl:stylesheet> |