From 14e30857ea421135ad076abc0a16868814f398ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 24 Oct 2017 11:37:59 +0200 Subject: [PATCH] [DI] Throw when a service name or an alias contains dynamic values (prevent an infinite loop) --- .../Compiler/CheckDefinitionValidityPass.php | 13 ++++++++++ .../CheckDefinitionValidityPassTest.php | 24 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php index 5666ecd173..a8a652c7a2 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php @@ -12,6 +12,7 @@ namespace Symfony\Component\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\EnvParameterException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; /** @@ -75,6 +76,18 @@ class CheckDefinitionValidityPass implements CompilerPassInterface } } } + + $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs); + if (null !== $usedEnvs) { + throw new EnvParameterException(array($resolvedId), null, 'A service name ("%s") cannot contain dynamic values.'); + } + } + + foreach ($container->getAliases() as $id => $alias) { + $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs); + if (null !== $usedEnvs) { + throw new EnvParameterException(array($resolvedId), null, 'An alias name ("%s") cannot contain dynamic values.'); + } } } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php index 585bb35766..473d5667d4 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php @@ -76,6 +76,30 @@ class CheckDefinitionValidityPassTest extends TestCase $this->process($container); } + /** + * @expectedException \Symfony\Component\DependencyInjection\Exception\EnvParameterException + */ + public function testDynamicServiceName() + { + $container = new ContainerBuilder(); + $env = $container->getParameterBag()->get('env(BAR)'); + $container->register("foo.$env", 'class'); + + $this->process($container); + } + + /** + * @expectedException \Symfony\Component\DependencyInjection\Exception\EnvParameterException + */ + public function testDynamicAliasName() + { + $container = new ContainerBuilder(); + $env = $container->getParameterBag()->get('env(BAR)'); + $container->setAlias("foo.$env", 'class'); + + $this->process($container); + } + protected function process(ContainerBuilder $container) { $pass = new CheckDefinitionValidityPass();