From c1ae7b6ad7af213c7ecc21a1c68a72c41a6f397f Mon Sep 17 00:00:00 2001 From: Wesley Lancel Date: Tue, 4 Oct 2016 09:14:18 +0200 Subject: [PATCH] Prevent infinite loop in PropertyMetadata --- .../Component/Validator/Mapping/PropertyMetadata.php | 6 ++++++ .../Validator/Tests/Mapping/PropertyMetadataTest.php | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/Symfony/Component/Validator/Mapping/PropertyMetadata.php b/src/Symfony/Component/Validator/Mapping/PropertyMetadata.php index ac71be8285..ebc83e1d6f 100644 --- a/src/Symfony/Component/Validator/Mapping/PropertyMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/PropertyMetadata.php @@ -58,8 +58,14 @@ class PropertyMetadata extends MemberMetadata */ protected function newReflectionMember($objectOrClassName) { + $originalClass = is_string($objectOrClassName) ? $objectOrClassName : get_class($objectOrClassName); + while (!property_exists($objectOrClassName, $this->getName())) { $objectOrClassName = get_parent_class($objectOrClassName); + + if (false === $objectOrClassName) { + throw new ValidatorException(sprintf('Property "%s" does not exist in class "%s"', $this->getName(), $originalClass)); + } } $member = new \ReflectionProperty($objectOrClassName, $this->getName()); diff --git a/src/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php b/src/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php index f411d950e1..e0ff920fe1 100644 --- a/src/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php +++ b/src/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php @@ -42,4 +42,14 @@ class PropertyMetadataTest extends \PHPUnit_Framework_TestCase $this->assertTrue($metadata->isPublic($entity)); $this->assertEquals('Overridden data', $metadata->getPropertyValue($entity)); } + + public function testGetPropertyValueFromRemovedProperty() + { + $entity = new Entity('foobar'); + $metadata = new PropertyMetadata(self::CLASSNAME, 'internal'); + $metadata->name = 'test'; + + $this->setExpectedException('Symfony\Component\Validator\Exception\ValidatorException'); + $metadata->getPropertyValue($entity); + } }