Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
bug #27237 [Debug] Fix populating error_get_last() for handled silent…
… errors (nicolas-grekas)

This PR was merged into the 2.7 branch.

Discussion
----------

[Debug] Fix populating error_get_last() for handled silent errors

| Q             | A
| ------------- | ---
| Branch?       | 2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

When a userland error handler doesn't return `false`, `error_get_last()` is not updated, so we cannot see the real last error, but the previous one.

See https://3v4l.org/Smmt7

Commits
-------

d7e612d [Debug] Fix populating error_get_last() for handled silent errors
  • Loading branch information
fabpot committed May 14, 2018
2 parents 15b03a8 + d7e612d commit 30ffb61
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/Symfony/Component/Debug/ErrorHandler.php
Expand Up @@ -377,13 +377,15 @@ private function reRegister($prev)
*/
public function handleError($type, $message, $file, $line)
{
$level = error_reporting() | E_RECOVERABLE_ERROR | E_USER_ERROR | E_DEPRECATED | E_USER_DEPRECATED;
$level = error_reporting();
$silenced = 0 === ($level & $type);
$level |= E_RECOVERABLE_ERROR | E_USER_ERROR | E_DEPRECATED | E_USER_DEPRECATED;
$log = $this->loggedErrors & $type;
$throw = $this->thrownErrors & $type & $level;
$type &= $level | $this->screamedErrors;

if (!$type || (!$log && !$throw)) {
return $type && $log;
return !$silenced && $type && $log;
}
$scope = $this->scopedErrors & $type;

Expand Down Expand Up @@ -479,7 +481,7 @@ public function handleError($type, $message, $file, $line)
}
}

return $type && $log;
return !$silenced && $type && $log;
}

/**
Expand Down
24 changes: 24 additions & 0 deletions src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php
Expand Up @@ -64,6 +64,30 @@ public function testRegister()
}
}

public function testErrorGetLast()
{
$handler = ErrorHandler::register();
$logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
$handler->setDefaultLogger($logger);
$handler->screamAt(E_ALL);

try {
@trigger_error('Hello', E_USER_WARNING);
$expected = array(
'type' => E_USER_WARNING,
'message' => 'Hello',
'file' => __FILE__,
'line' => __LINE__ - 5,
);
$this->assertSame($expected, error_get_last());
} catch (\Exception $e) {
restore_error_handler();
restore_exception_handler();

throw $e;
}
}

public function testNotice()
{
ErrorHandler::register();
Expand Down

0 comments on commit 30ffb61

Please sign in to comment.