Ver Fonte

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
Egor Korobov há 2 anos atrás
pai
commit
ed80d53ab2

+ 3 - 0
src/Monolog/Formatter/NormalizerFormatter.php

@@ -174,6 +174,9 @@ class NormalizerFormatter implements FormatterInterface
             if ($data instanceof \JsonSerializable) {
                 /** @var null|scalar|array<array|scalar|null> $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();

+ 14 - 0
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');