bug #27232 [Cache][Lock] Fix usages of error_get_last() (nicolas-grekas)

This PR was merged into the 3.4 branch.

Discussion
----------

[Cache][Lock] Fix usages of error_get_last()

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| 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
-------

7904784a94 [Cache][Lock] Fix usages of error_get_last()
This commit is contained in:
Fabien Potencier 2018-05-14 08:38:31 +02:00
commit fb881194b6
2 changed files with 8 additions and 7 deletions

View File

@ -126,9 +126,12 @@ trait RedisTrait
throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e->getMessage(), $dsn));
}
if (@!$redis->isConnected()) {
$e = ($e = error_get_last()) && preg_match('/^Redis::p?connect\(\): (.*)/', $e['message'], $e) ? sprintf(' (%s)', $e[1]) : '';
throw new InvalidArgumentException(sprintf('Redis connection failed%s: %s', $e, $dsn));
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
$isConnected = $redis->isConnected();
restore_error_handler();
if (!$isConnected) {
$error = preg_match('/^Redis::p?connect\(\): (.*)/', $error, $error) ? sprintf(' (%s)', $error[1]) : '';
throw new InvalidArgumentException(sprintf('Redis connection failed%s: %s', $error, $dsn));
}
if ((null !== $auth && !$redis->auth($auth))

View File

@ -78,8 +78,7 @@ class FlockStore implements StoreInterface
);
// Silence error reporting
set_error_handler(function () {
});
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
if (!$handle = fopen($fileName, 'r')) {
if ($handle = fopen($fileName, 'x')) {
chmod($fileName, 0444);
@ -91,8 +90,7 @@ class FlockStore implements StoreInterface
restore_error_handler();
if (!$handle) {
$error = error_get_last();
throw new LockStorageException($error['message'], 0, null);
throw new LockStorageException($error, 0, null);
}
// On Windows, even if PHP doc says the contrary, LOCK_NB works, see