Przeglądaj źródła

[HttpKernel] fixed recursion when flattenning an exception stack trace

Fabien Potencier 14 lat temu
rodzic
commit
76a5816d60

+ 6 - 2
src/Symfony/Component/HttpKernel/Exception/FlattenException.php

@@ -169,14 +169,18 @@ class FlattenException
         }
     }
 
-    private function flattenArgs($args)
+    private function flattenArgs($args, $level = 0)
     {
         $result = array();
         foreach ($args as $key => $value) {
             if (is_object($value)) {
                 $result[$key] = array('object', get_class($value));
             } elseif (is_array($value)) {
-                $result[$key] = array('array', $this->flattenArgs($value));
+                if ($level > 100) {
+                    $result[$key] = array('array', '*DEEP NESTED ARRAY*');
+                } else {
+                    $result[$key] = array('array', $this->flattenArgs($value, ++$level));
+                }
             } elseif (null === $value) {
                 $result[$key] = array('null', null);
             } elseif (is_bool($value)) {

+ 15 - 0
tests/Symfony/Tests/Component/HttpKernel/Exception/FlattenExceptionTest.php

@@ -71,4 +71,19 @@ class FlattenExceptionTest extends \PHPUnit_Framework_TestCase
             array(new \Exception('test', 123), 500),
         );
     }
+
+    public function testRecursionInArguments()
+    {
+        $a = array('foo', array(2, &$a));
+        $exception = $this->createException($a);
+
+        $flattened = FlattenException::create($exception);
+        $trace = $flattened->getTrace();
+        $this->assertContains('*DEEP NESTED ARRAY*', serialize($trace));
+    }
+
+    private function createException($foo)
+    {
+        return new \Exception();
+    }
 }