From af728947d6666f659bfdb29aae7870cf6f0b2b8a Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 3 Jul 2015 09:28:44 +0200 Subject: [PATCH] fixed sandbox disabling when using the include function --- CHANGELOG | 2 +- lib/Twig/Extension/Core.php | 9 ++++++++- .../functions/include/sandbox_disabling.test | 16 ++++++++++++++++ .../sandbox_disabling_ignore_missing.test | 13 +++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test create mode 100644 test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test diff --git a/CHANGELOG b/CHANGELOG index 26a158864..1bb17601a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 1.18.3 (2015-XX-XX) - * n/a + * fixed sandbox disabling when using the include function * 1.18.2 (2015-06-06) diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index 82a558586..ffb077217 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -1427,10 +1427,15 @@ function twig_include(Twig_Environment $env, $context, $template, $variables = a } } + $result = null; try { - return $env->resolveTemplate($template)->render($variables); + $result = $env->resolveTemplate($template)->render($variables); } catch (Twig_Error_Loader $e) { if (!$ignoreMissing) { + if ($isSandboxed && !$alreadySandboxed) { + $sandbox->disableSandbox(); + } + throw $e; } } @@ -1438,6 +1443,8 @@ function twig_include(Twig_Environment $env, $context, $template, $variables = a if ($isSandboxed && !$alreadySandboxed) { $sandbox->disableSandbox(); } + + return $result; } /** diff --git a/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test b/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test new file mode 100644 index 000000000..8ffc49225 --- /dev/null +++ b/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag sandboxed +--TEMPLATE-- +{{ include("foo.twig", sandboxed = true) }} +{{ include("bar.twig") }} +--TEMPLATE(foo.twig)-- +foo +--TEMPLATE(bar.twig)-- +{{ foo|e }} +--DATA-- +return array('foo' => 'bar
') +--EXPECT-- +foo + + +bar<br /> diff --git a/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test b/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test new file mode 100644 index 000000000..8bf6e102d --- /dev/null +++ b/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test @@ -0,0 +1,13 @@ +--TEST-- +"include" tag sandboxed +--TEMPLATE-- +{{ include("unknown.twig", sandboxed = true, ignore_missing = true) }} +{{ include("bar.twig") }} +--TEMPLATE(bar.twig)-- +{{ foo|e }} +--DATA-- +return array('foo' => 'bar
') +--EXPECT-- + + +bar<br />