summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--ext/xsl/tests/bug49634.phpt105
-rw-r--r--ext/xsl/tests/bug49634.xml1
-rw-r--r--ext/xsl/xsltprocessor.c3
4 files changed, 113 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index f55ff056ca..bf759c847b 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,10 @@ PHP NEWS
1600). (Derick, T. Carter)
. Fixed bug #61599 (Wrong Day of Week). (Derick, T. Carter)
+- XSL
+ . Fixed bug #49634 (Segfault throwing an exception in a XSL registered
+ function). (Mike)
+
?? ??? 2013, PHP 5.4.23
- Core:
diff --git a/ext/xsl/tests/bug49634.phpt b/ext/xsl/tests/bug49634.phpt
new file mode 100644
index 0000000000..b009fd5fb8
--- /dev/null
+++ b/ext/xsl/tests/bug49634.phpt
@@ -0,0 +1,105 @@
+--TEST--
+bug #49634 (Segfault throwing an exception in a XSL registered function)
+--SKIPIF--
+<?php
+extension_loaded("xsl") or die("skip need ext/xsl");
+?>
+--FILE--
+<?php
+
+$sXml = <<<XML
+<?xml version="1.0" encoding="UTF-8" ?>
+<root>
+ test
+</root>
+XML;
+
+$cDIR = __DIR__;
+$sXsl = <<<XSL
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ext="http://php.net/xsl"
+ xsl:extension-element-prefixes="ext"
+ exclude-result-prefixes="ext">
+ <xsl:output encoding="UTF-8" indent="yes" method="xml" />
+ <xsl:template match="/">
+ <xsl:value-of select="ext:function('testFunction', document('$cDIR/bug49634.xml')/root)"/>
+ </xsl:template>
+</xsl:stylesheet>
+XSL;
+
+function testFunction($a)
+{
+ throw new Exception('Test exception.');
+}
+
+$domXml = new DOMDocument;
+$domXml->loadXML($sXml);
+$domXsl = new DOMDocument;
+$domXsl->loadXML($sXsl);
+
+for ($i = 0; $i < 10; $i++)
+{
+ $xsltProcessor = new XSLTProcessor();
+ $xsltProcessor->registerPHPFunctions(array('testFunction'));
+ $xsltProcessor->importStyleSheet($domXsl);
+ try {
+ @$xsltProcessor->transformToDoc($domXml);
+ } catch (Exception $e) {
+ echo $e,"\n";
+ }
+}
+?>
+===DONE===
+--EXPECTF--
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+exception 'Exception' with message 'Test exception.' in %s:%d
+Stack trace:
+#0 [internal function]: testFunction(Array)
+#1 %s(%d): XSLTProcessor->transformToDoc(Object(DOMDocument))
+#2 {main}
+===DONE===
diff --git a/ext/xsl/tests/bug49634.xml b/ext/xsl/tests/bug49634.xml
new file mode 100644
index 0000000000..f3f286eafc
--- /dev/null
+++ b/ext/xsl/tests/bug49634.xml
@@ -0,0 +1 @@
+<root/>
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c
index af11104a2e..f5acc14bbb 100644
--- a/ext/xsl/xsltprocessor.c
+++ b/ext/xsl/xsltprocessor.c
@@ -279,7 +279,10 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
node->type = XML_NAMESPACE_DECL;
node->parent = nsparent;
node->ns = curns;
+ } else {
+ node = xmlDocCopyNodeList(domintern->document->ptr, node);
}
+
child = php_dom_create_object(node, &ret, child, domintern TSRMLS_CC);
add_next_index_zval(args[i], child);
}