Skip to content

Commit

Permalink
Prevent infinite recursion of self-referencing embeds
Browse files Browse the repository at this point in the history
  • Loading branch information
zarathustra323 committed Feb 9, 2017
1 parent 960f267 commit e0ceedf
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
8 changes: 7 additions & 1 deletion src/Metadata/Driver/YamlFileDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,13 @@ protected function setEmbeds(Metadata\Interfaces\EmbedInterface $metadata, array
$mapping['entity'] = null;
}

$embedMeta = $this->loadMetadataForEmbed($mapping['entity']);
if ($metadata instanceof Metadata\EmbedMetadata && $mapping['entity'] === $metadata->name) {
// This embed meta is referencing itself as an embed property. As such, do not recreate.
// This prevents infinite recursion.
$embedMeta = $metadata;
} else {
$embedMeta = $this->loadMetadataForEmbed($mapping['entity']);
}
if (null === $embedMeta) {
continue;
}
Expand Down
5 changes: 4 additions & 1 deletion src/Util/EntityUtility.php
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,10 @@ public function validateMetadataEmbeds(EmbedInterface $metadata, MetadataFactory
{
foreach ($metadata->getEmbeds() as $key => $embeddedProp) {
$this->validateMetadataAttributes($embeddedProp->embedMeta, $mf);
$this->validateMetadataEmbeds($embeddedProp->embedMeta, $mf);
if ($metadata !== $embeddedProp->embedMeta) {
// Only re-validate if the embedded prop reference isn't the same as the parent.
$this->validateMetadataEmbeds($embeddedProp->embedMeta, $mf);
}
}
return true;
}
Expand Down

0 comments on commit e0ceedf

Please sign in to comment.