10000 [2.7] Workaround https://bugs.php.net/63206 · symfony/symfony@d44e0b7 · GitHub
[go: up one dir, main page]

Skip to content

Commit d44e0b7

Browse files
[2.7] Workaround https://bugs.php.net/63206
1 parent 4c32c1a commit d44e0b7

File tree

4 files changed

+21
-13
lines changed

4 files changed

+21
-13
lines changed

src/Symfony/Component/Debug/ErrorHandler.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class ErrorHandler
9595

9696
private $loggedTraces = array();
9797
private $isRecursive = 0;
98+
private $isRoot = false;
9899
private $exceptionHandler;
99100

100101
private static $reservedMemory;
@@ -134,7 +135,12 @@ public static function register($handler = null, $replace = true)
134135
$handler = new static();
135136
}
136137

137-
$prev = set_error_handler(array($handler, 'handleError'), $handler->thrownErrors | $handler->loggedErrors);
138+
if (null === $prev = set_error_handler(array($handler, 'handleError'))) {
139+
restore_error_handler();
140+
// Specifying the error types earlier would expose us to https://bugs.php.net/63206
141+
set_error_handler(array($handler, 'handleError'), $handler->thrownErrors | $handler->loggedErrors);
142+
$handler->isRoot = true;
143+
}
138144

139145
if ($handlerIsNew && is_array($prev) && $prev[0] instanceof self) {
140146
$handler = $prev[0];
@@ -326,12 +332,16 @@ public function screamAt($levels, $replace = false)
326332
private function reRegister($prev)
327333
{
328334
if ($prev !== $this->thrownErrors | $this->loggedErrors) {
329-
$handler = set_error_handler('var_dump', 0);
335+
$handler = set_error_handler('var_dump');
330336
$handler = is_array($handler) ? $handler[0] : null;
331337
restore_error_handler();
332338
if ($handler === $this) {
333339
restore_error_handler();
334-
set_error_handler(array($this, 'handleError'), $this->thrownErrors | $this->loggedErrors);
340+
if ($this->isRoot) {
341+
set_error_handler(array($this, 'handleError'), $this->thrownErrors | $this->loggedErrors);
342+
} else {
343+
set_error_handler(array($this, 'handleError'));
344+
}
335345
}
336346
}
337347
}
@@ -527,7 +537,7 @@ public static function handleFatalError(array $error = null)
527537

528538
self::$reservedMemory = null;
529539

530-
$handler = set_error_handler('var_dump', 0);
540+
$handler = set_error_handler('var_dump');
531541
$handler = is_array($handler) ? $handler[0] : null;
532542
restore_error_handler();
533543

@@ -672,7 +682,7 @@ public static function setLogger(LoggerInterface $logger, $channel = 'deprecatio
672682
{
673683
@trigger_error('The '.__METHOD__.' static method is deprecated since version 2.6 and will be removed in 3.0. Use the setLoggers() or setDefaultLogger() methods instead.', E_USER_DEPRECATED);
674684

675-
$handler = set_error_handler('var_dump', 0);
685+
$handler = set_error_handler('var_dump');
676686
$handler = is_array($handler) ? $handler[0] : null;
677687
restore_error_handler();
678688
if (!$handler instanceof self) {

src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ public function testClassAlias()
175175
*/
176176
public function testDeprecatedSuper($class, $super, $type)
177177
{
178-
set_error_handler('var_dump', 0);
178+
set_error_handler(function() { return false; });
179179
$e = error_reporting(0);
180180
trigger_error('', E_USER_DEPRECATED);
181181

@@ -205,7 +205,7 @@ public function provideDeprecatedSuper()
205205

206206
public function testDeprecatedSuperInSameNamespace()
207207
{
208-
set_error_handler('var_dump', 0);
208+
set_error_handler(function() { return false; });
209209
$e = error_reporting(0);
210210
trigger_error('', E_USER_NOTICE);
211211

@@ -231,7 +231,7 @@ public function testReservedForPhp7()
231231
$this->markTestSkipped('PHP7 already prevents using reserved names.');
232232
}
233233

234-
set_error_handler('var_dump', 0);
234+
set_error_handler(function() { return false; });
235235
$e = error_reporting(0);
236236
trigger_error('', E_USER_NOTICE);
237237

src/Symfony/Component/Filesystem/LockHandler.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ public function lock($blocking = false)
6868
return true;
6969
}
7070

71-
// Silence both userland and native PHP error handlers
72-
$errorLevel = error_reporting(0);
73-
set_error_handler('var_dump', 0);
71+
// Silence error reporting
72+
set_error_handler(function() {});
7473

7574
if (!$this->handle = fopen($this->file, 'r')) {
7675
if ($this->handle = fopen($this->file, 'x')) {
@@ -81,7 +80,6 @@ public function lock($blocking = false)
8180
}
8281
}
8382
restore_error_handler();
84-
error_reporting($errorLevel);
8583

8684
if ( 1E79 !$this->handle) {
8785
$error = error_get_last();

src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public function configure(Event $event = null)
6767
}
6868
$this->firstCall = false;
6969
if ($this->logger || null !== $this->throwAt) {
70-
$handler = set_error_handler('var_dump', 0);
70+
$handler = set_error_handler('var_dump');
7171
$handler = is_array($handler) ? $handler[0] : null;
7272
restore_error_handler();
7373
if ($handler instanceof ErrorHandler) {

0 commit comments

Comments
 (0)
0