xref: /PHP-7.4/ext/xsl/tests/bug70078.phpt (revision 8226e704)
1--TEST--
2Bug #70078 (XSL callbacks with nodes as parameter leak memory)
3--SKIPIF--
4<?php
5if (!extension_loaded('xsl')) die('skip xsl extension not available');
6?>
7--FILE--
8<?php
9// create big dummy document:
10$dom = new \DOMDocument();
11$rootNode = $dom->appendChild($dom->createElement('root'));
12for ($i = 0; $i <= 100; $i++) {
13    $level1Node = $rootNode->appendChild($dom->createElement('level1'));
14    for ($j = 0; $j <= 100; $j++) {
15        $level2Node = $level1Node->appendChild($dom->createElement('level2'));
16        for ($k = 0; $k <= 10; $k++) {
17            $level3Node = $level2Node->appendChild($dom->createElement('level3', 'test'));
18        }
19    }
20}
21
22function testPhpFunction($node) {
23    return 'test2';
24}
25
26$xslStr = <<<EOF
27<?xml version="1.0" encoding="utf-8"?>
28<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
29    <xsl:template match="root">
30        <output>
31            <xsl:for-each select="level1">
32                <node>
33                    <xsl:value-of select="php:function('testPhpFunction', .)" />
34                </node>
35            </xsl:for-each>
36        </output>
37    </xsl:template>
38</xsl:stylesheet>
39EOF;
40
41$xsl = new \DOMDocument();
42$xsl->loadXML($xslStr);
43$xslt = new \XSLTProcessor();
44$xslt->registerPHPFunctions('testPhpFunction');
45$xslt->importStyleSheet($xsl);
46
47echo $xslt->transformToXML($dom);
48?>
49--EXPECT--
50<?xml version="1.0"?>
51<output xmlns:php="http://php.net/xsl"><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node><node>test2</node></output>
52