From ed80d53ab293f2a62beb9a6d2e9e6c53f2a37d7c Mon Sep 17 00:00:00 2001 From: Egor Korobov Date: Fri, 8 Sep 2023 17:40:20 +0300 Subject: [PATCH] Fix fatal error in NormalizeFormatter: method_exists(): The script tried to execute a method or access a property of an incomplete object. Closes #1833 Fixes #1834 --- src/Monolog/Formatter/NormalizerFormatter.php | 3 +++ .../Monolog/Formatter/NormalizerFormatterTest.php | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Monolog/Formatter/NormalizerFormatter.php b/src/Monolog/Formatter/NormalizerFormatter.php index 5441bc0a..e4409f52 100644 --- a/src/Monolog/Formatter/NormalizerFormatter.php +++ b/src/Monolog/Formatter/NormalizerFormatter.php @@ -174,6 +174,9 @@ class NormalizerFormatter implements FormatterInterface if ($data instanceof \JsonSerializable) { /** @var null|scalar|array $value */ $value = $data->jsonSerialize(); + } elseif (\get_class($data) === '__PHP_Incomplete_Class') { + $accessor = new \ArrayObject($data); + $value = $accessor['__PHP_Incomplete_Class_Name']; } elseif (method_exists($data, '__toString')) { /** @var string $value */ $value = $data->__toString(); diff --git a/tests/Monolog/Formatter/NormalizerFormatterTest.php b/tests/Monolog/Formatter/NormalizerFormatterTest.php index 162f34b3..0c7ba76a 100644 --- a/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ b/tests/Monolog/Formatter/NormalizerFormatterTest.php @@ -415,6 +415,20 @@ class NormalizerFormatterTest extends TestCase ); } + public function testCanNormalizeIncompleteObject(): void + { + $serialized = "O:17:\"Monolog\TestClass\":1:{s:23:\"\x00Monolog\TestClass\x00name\";s:4:\"test\";}"; + $object = unserialize($serialized); + + $formatter = new NormalizerFormatter(); + $record = ['context' => ['object' => $object]]; + $result = $formatter->format($record); + + $this->assertEquals([ + '__PHP_Incomplete_Class' => 'Monolog\\TestClass', + ], $result['context']['object']); + } + private function throwHelper($arg) { throw new \RuntimeException('Thrown');