From ea24bfca20b84a117f032ed9367b3aa1ef43d548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Fri, 3 Apr 2020 15:49:52 +0200 Subject: [PATCH] [Serializer] Catch \Throwable in getCacheKey() --- .../Normalizer/AbstractObjectNormalizer.php | 14 ++++++++++++++ .../AbstractObjectNormalizerTest.php | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 56dc3c590ede3..5a607b459b1a7 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -401,6 +401,20 @@ protected function createChildContext(array $parentContext, $attribute/*, string private function getCacheKey($format, array $context) { unset($context['cache_key']); // avoid artificially different keys + + if (interface_exists(\Throwable::class)) { + try { + return md5($format.serialize([ + 'context' => $context, + 'ignored' => $this->ignoredAttributes, + 'camelized' => $this->camelizedAttributes, + ])); + } catch (\Throwable $exception) { + // The context cannot be serialized, skip the cache + return false; + } + } + try { return md5($format.serialize([ 'context' => $context, diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php index d5d7cace362e4..149985ee78b2d 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php @@ -194,6 +194,13 @@ public function testExtraAttributesException() 'allow_extra_attributes' => false, ]); } + + public function testContextNotSerializable() + { + $normalizer = new ObjectNormalizer(); + $result = $normalizer->normalize(new Dummy(), null, ['not_serializable' => new NotSerializable()]); + $this->assertIsArray($result); + } } class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer @@ -379,3 +386,15 @@ public function setSerializer(SerializerInterface $serializer) $this->serializer = $serializer; } } + +class NotSerializable +{ + function __sleep() + { + if (class_exists(\Error::class)) { + throw new \Error('not serializable'); + } + + throw new \Exception('not serializable'); + } +}