Skip to content

Commit 20f27f9

Browse files
[DI] fix infinite loop involving self-references in decorated services
1 parent 8877a33 commit 20f27f9

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

src/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ protected function processValue($value, $isRoot = false)
113113
return $value;
114114
}
115115
$this->currentDefinition = $value;
116+
} elseif ($this->currentDefinition === $value) {
117+
return $value;
116118
}
117119
$this->lazy = false;
118120

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,22 @@ public function testUninitializedSyntheticReference()
14791479
$container->set('foo', (object) array(123));
14801480
$this->assertEquals((object) array('foo' => (object) array(123)), $container->get('bar'));
14811481
}
1482+
1483+
public function testDecoratedSelfReferenceInvolvingPrivateServices()
1484+
{
1485+
$container = new ContainerBuilder();
1486+
$container->register('foo', 'stdClass')
1487+
->setPublic(false)
1488+
->setProperty('bar', new Reference('foo'));
1489+
$container->register('baz', 'stdClass')
1490+
->setPublic(false)
1491+
->setProperty('inner', new Reference('baz.inner'))
1492+
->setDecoratedService('foo');
1493+
1494+
$container->compile();
1495+
1496+
$this->assertSame(array('service_container'), array_keys($container->getDefinitions()));
1497+
}
14821498
}
14831499

14841500
class FooClass

0 commit comments

Comments
 (0)