From f4cd9a59393e714f7c324dda8e6f3b32e54a5601 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 1/2] [Serializer] Catch \Throwable in getCacheKey() --- .../Normalizer/AbstractObjectNormalizer.php | 14 ++++++++++++++ .../Tests/Normalizer/ObjectNormalizerTest.php | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) 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/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index 62082e0cd2883..b33cbe1456256 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -565,8 +565,7 @@ public function testNormalizeNotSerializableContext() 'bar' => null, ]; - $this->assertEquals($expected, $this->normalizer->normalize($objectDummy, null, ['not_serializable' => function () { - }])); + $this->assertEquals($expected, $this->normalizer->normalize($objectDummy, null, ['not_serializable' => new NotSerializable()])); } public function testMaxDepth() @@ -1102,3 +1101,15 @@ public function getFoo() return $this->Foo; } } + +class NotSerializable +{ + public function __sleep() + { + if (class_exists(\Error::class)) { + throw new \Error('not serializable'); + } + + throw new \Exception('not serializable'); + } +} From 8da777d194d9bab7eee2005fa71918336c5a0459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Fri, 3 Apr 2020 23:47:05 +0200 Subject: [PATCH 2/2] @stof review --- .../Normalizer/AbstractObjectNormalizer.php | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 5a607b459b1a7..d912fea2b2913 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -401,29 +401,18 @@ 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, 'ignored' => $this->ignoredAttributes, 'camelized' => $this->camelizedAttributes, ])); - } catch (\Exception $exception) { + } catch (\Throwable $exception) { // The context cannot be serialized, skip the cache return false; + } catch (\Exception $exception) { + // compatibility layer for PHP 5 + return false; } } }