From 6196fe5b40d3df385d07a5a7fd54ddde9f6bc6c4 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 3 May 2019 06:20:17 +0200 Subject: [PATCH] fixed partial output leak when a PHP fatal error occurs --- CHANGELOG | 1 + src/Extension/DebugExtension.php | 2 +- src/Node/MacroNode.php | 2 +- src/Node/SetNode.php | 2 +- src/Node/SpacelessNode.php | 2 +- src/Template.php | 6 +++--- src/TemplateWrapper.php | 2 +- test/Twig/Tests/Node/MacroTest.php | 2 +- test/Twig/Tests/Node/SetTest.php | 2 +- test/Twig/Tests/Node/SpacelessTest.php | 2 +- 10 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7a719523f..c34553a49 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ * 1.40.2 (2019-XX-XX) + * fixed partial output leak when a PHP fatal error occurs * optimized context access on PHP 7.4 * 1.40.1 (2019-04-29) diff --git a/src/Extension/DebugExtension.php b/src/Extension/DebugExtension.php index 09b0223e2..cf5a220e0 100644 --- a/src/Extension/DebugExtension.php +++ b/src/Extension/DebugExtension.php @@ -54,7 +54,7 @@ function twig_var_dump(Environment $env, $context, array $vars = []) return; } - ob_start(); + ob_start(function () { return ''; }); if (!$vars) { $vars = []; diff --git a/src/Node/MacroNode.php b/src/Node/MacroNode.php index 8e3cc76a3..017578b5e 100644 --- a/src/Node/MacroNode.php +++ b/src/Node/MacroNode.php @@ -104,7 +104,7 @@ class MacroNode extends Node ->outdent() ->write("]);\n\n") ->write("\$blocks = [];\n\n") - ->write("ob_start();\n") + ->write("ob_start(function () { return ''; });\n") ->write("try {\n") ->indent() ->subcompile($this->getNode('body')) diff --git a/src/Node/SetNode.php b/src/Node/SetNode.php index 2c10a3a92..15e54675e 100644 --- a/src/Node/SetNode.php +++ b/src/Node/SetNode.php @@ -58,7 +58,7 @@ class SetNode extends Node implements NodeCaptureInterface } else { if ($this->getAttribute('capture')) { $compiler - ->write("ob_start();\n") + ->write("ob_start(function () { return ''; });\n") ->subcompile($this->getNode('values')) ; } diff --git a/src/Node/SpacelessNode.php b/src/Node/SpacelessNode.php index 9beebf32c..9d8574800 100644 --- a/src/Node/SpacelessNode.php +++ b/src/Node/SpacelessNode.php @@ -31,7 +31,7 @@ class SpacelessNode extends Node { $compiler ->addDebugInfo($this) - ->write("ob_start();\n") + ->write("ob_start(function () { return ''; });\n") ->subcompile($this->getNode('body')) ->write("echo trim(preg_replace('/>\s+<', ob_get_clean()));\n") ; diff --git a/src/Template.php b/src/Template.php index 060730f2c..4264d1cad 100644 --- a/src/Template.php +++ b/src/Template.php @@ -253,7 +253,7 @@ abstract class Template implements \Twig_TemplateInterface */ public function renderParentBlock($name, array $context, array $blocks = []) { - ob_start(); + ob_start(function () { return ''; }); $this->displayParentBlock($name, $context, $blocks); return ob_get_clean(); @@ -274,7 +274,7 @@ abstract class Template implements \Twig_TemplateInterface */ public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true) { - ob_start(); + ob_start(function () { return ''; }); $this->displayBlock($name, $context, $blocks, $useBlocks); return ob_get_clean(); @@ -417,7 +417,7 @@ abstract class Template implements \Twig_TemplateInterface public function render(array $context) { $level = ob_get_level(); - ob_start(); + ob_start(function () { return ''; }); try { $this->display($context); } catch (\Exception $e) { diff --git a/src/TemplateWrapper.php b/src/TemplateWrapper.php index c3ccc8882..84c631761 100644 --- a/src/TemplateWrapper.php +++ b/src/TemplateWrapper.php @@ -96,7 +96,7 @@ final class TemplateWrapper { $context = $this->env->mergeGlobals($context); $level = ob_get_level(); - ob_start(); + ob_start(function () { return ''; }); try { $this->template->displayBlock($name, $context); } catch (\Exception $e) { diff --git a/test/Twig/Tests/Node/MacroTest.php b/test/Twig/Tests/Node/MacroTest.php index 429fa6e11..424d7dab4 100644 --- a/test/Twig/Tests/Node/MacroTest.php +++ b/test/Twig/Tests/Node/MacroTest.php @@ -59,7 +59,7 @@ public function getfoo(\$__foo__ = null, \$__bar__ = "Foo"$declaration) \$blocks = []; - ob_start(); + ob_start(function () { return ''; }); try { echo "foo"; } catch (\Exception \$e) { diff --git a/test/Twig/Tests/Node/SetTest.php b/test/Twig/Tests/Node/SetTest.php index 4f6b94271..ff4e43e47 100644 --- a/test/Twig/Tests/Node/SetTest.php +++ b/test/Twig/Tests/Node/SetTest.php @@ -49,7 +49,7 @@ EOF $node = new SetNode(true, $names, $values, 1); $tests[] = [$node, <<env->getCharset()); EOF diff --git a/test/Twig/Tests/Node/SpacelessTest.php b/test/Twig/Tests/Node/SpacelessTest.php index c0b7d526a..13f400fd3 100644 --- a/test/Twig/Tests/Node/SpacelessTest.php +++ b/test/Twig/Tests/Node/SpacelessTest.php @@ -32,7 +32,7 @@ class Twig_Tests_Node_SpacelessTest extends NodeTestCase return [ [$node, <<
foo
"; echo trim(preg_replace('/>\s+<', ob_get_clean())); EOF