com php-src: Fix bug #71540 - NULL pointer dereference in xsl_ext_function_php(): ext/xsl/tests/bug71 540.phpt ext/xsl/xsltprocessor.c
| From: | Stanislav Malyshev | Date: | Mon, 15 Feb 2016 08:10:21 +0000 |
| Subject: | com php-src: Fix bug #71540 - NULL pointer dereference in xsl_ext_function_php(): ext/xsl/tests/bug71 540.phpt ext/xsl/xsltprocessor.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-91052@lists.php.net to get a copy of this message | ||
Commit: 889e3b62f4229784143c5d645c15a8a42f07797d
Author: Stanislav Malyshev <stas@php.net> Sun, 14 Feb 2016 23:35:29 -0800
Parents: e18910c2966b8197af8b028e3e3153ee975c4876
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=889e3b62f4229784143c5d645c15a8a42f07797d
Log:
Fix bug #71540 - NULL pointer dereference in xsl_ext_function_php()
Bugs:
https://bugs.php.net/71540
Changed paths:
A ext/xsl/tests/bug71540.phpt
M ext/xsl/xsltprocessor.c
Diff:
diff --git a/ext/xsl/tests/bug71540.phpt b/ext/xsl/tests/bug71540.phpt
new file mode 100644
index 0000000..e93fb0e
--- /dev/null
+++ b/ext/xsl/tests/bug71540.phpt
@@ -0,0 +1,67 @@
+--TEST--
+Bug #71540 (NULL pointer dereference in xsl_ext_function_php())
+--SKIPIF--
+<?php
+if (!extension_loaded('xsl')) die("skip Extension XSL is required\n");
+?>
+--FILE--
+<?php
+$xml = <<<EOB
+<allusers>
+ <user>
+ <uid>bob</uid>
+ </user>
+</allusers>
+EOB;
+$xsl = <<<EOB
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:php="http://php.net/xsl">
+<xsl:output method="html" encoding="utf-8" indent="yes"/>
+ <xsl:template match="allusers">
+ <html><body>
+ <h2>Users</h2>
+ <table>
+ <xsl:for-each select="user">
+ <tr><td>
+ <xsl:value-of
+ select="php:function('test',uid,test(test))"/>
+ </td></tr>
+ </xsl:for-each>
+ </table>
+ </body></html>
+ </xsl:template>
+</xsl:stylesheet>
+EOB;
+
+$xmldoc = new DOMDocument();
+$xmldoc->loadXML($xml);
+$xsldoc = new DOMDocument();
+$xsldoc->loadXML($xsl);
+
+$proc = new XSLTProcessor();
+$proc->registerPHPFunctions();
+$proc->importStyleSheet($xsldoc);
+echo $proc->transformToXML($xmldoc);
+?>
+DONE
+--EXPECTF--
+Warning: XSLTProcessor::transformToXml(): xmlXPathCompOpEval: function test not found in
%sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): Unregistered function in %sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): Stack usage errror in %sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): Stack usage errror in %sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 2 objects left on the stack. in
%sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): runtime error: file %s line 13 element value-of in
%sbug71540.php on line %d
+
+Warning: XSLTProcessor::transformToXml(): XPath evaluation returned no result. in %sbug71540.php on
line %d
+<html xmlns:php="http://php.net/xsl"><body>
+<h2>Users</h2>
+<table><tr><td></td></tr></table>
+</body></html>
+DONE
\ No newline at end of file
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c
index be46d38..ec30423 100644
--- a/ext/xsl/xsltprocessor.c
+++ b/ext/xsl/xsltprocessor.c
@@ -231,6 +231,10 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int
t
/* Reverse order to pop values off ctxt stack */
for (i = nargs - 2; i >= 0; i--) {
obj = valuePop(ctxt);
+ if (obj == NULL) {
+ ZVAL_NULL(&args[i]);
+ continue;
+ }
switch (obj->type) {
case XPATH_STRING:
ZVAL_STRING(&args[i], (char *)obj->stringval);