diff --git a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php index ef4334d21f391..5eda2bafdfb10 100644 --- a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php +++ b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php @@ -102,8 +102,11 @@ public function __construct($message, array $trace, $file) } set_error_handler(function () {}); - $parsedMsg = unserialize($this->message); - restore_error_handler(); + try { + $parsedMsg = unserialize($this->message); + } finally { + restore_error_handler(); + } if ($parsedMsg && isset($parsedMsg['deprecation'])) { $this->message = $parsedMsg['deprecation']; $this->originClass = $parsedMsg['class']; diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index d054882d2788f..0cfb4f47c639d 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -205,8 +205,11 @@ public static function createConnection(string $dsn, array $options = []) @$redis->{$connect}($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') ? [['stream' => $params['ssl'] ?? null]] : []); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $isConnected = $redis->isConnected(); - restore_error_handler(); + try { + $isConnected = $redis->isConnected(); + } finally { + restore_error_handler(); + } if (!$isConnected) { $error = preg_match('/^Redis::p?connect\(\): (.*)/', $error, $error) ? sprintf(' (%s)', $error[1]) : ''; throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$error.'.'); diff --git a/src/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php b/src/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php index f415a726a01bb..469b12f87f6f1 100644 --- a/src/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php +++ b/src/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php @@ -254,14 +254,19 @@ public function testSetDeprecated() }; $prevErrorHandler = set_error_handler($deprecationHandler); - $node->finalize([]); - restore_error_handler(); - + try { + $node->finalize([]); + } finally { + restore_error_handler(); + } $this->assertFalse($deprecationTriggered, '->finalize() should not trigger if the deprecated node is not set'); $prevErrorHandler = set_error_handler($deprecationHandler); - $node->finalize(['foo' => []]); - restore_error_handler(); + try { + $node->finalize(['foo' => []]); + } finally { + restore_error_handler(); + } $this->assertTrue($deprecationTriggered, '->finalize() should trigger if the deprecated node is set'); } diff --git a/src/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php b/src/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php index 2e68053381bcf..84e76c46df79c 100644 --- a/src/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php +++ b/src/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php @@ -67,13 +67,19 @@ public function testSetDeprecated() }; $prevErrorHandler = set_error_handler($deprecationHandler); - $node->finalize([]); - restore_error_handler(); + try { + $node->finalize([]); + } finally { + restore_error_handler(); + } $this->assertSame(0, $deprecationTriggered, '->finalize() should not trigger if the deprecated node is not set'); $prevErrorHandler = set_error_handler($deprecationHandler); - $node->finalize(['foo' => '']); - restore_error_handler(); + try { + $node->finalize(['foo' => '']); + } finally { + restore_error_handler(); + } $this->assertSame(1, $deprecationTriggered, '->finalize() should trigger if the deprecated node is set'); } diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index d7188c3218c26..4ec9cb24ce6c9 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -737,15 +737,10 @@ private static function box(callable $func, ...$args) self::$lastError = null; set_error_handler(__CLASS__.'::handleError'); try { - $result = $func(...$args); + return $func(...$args); + } finally { restore_error_handler(); - - return $result; - } catch (\Throwable $e) { } - restore_error_handler(); - - throw $e; } /** diff --git a/src/Symfony/Component/Finder/SplFileInfo.php b/src/Symfony/Component/Finder/SplFileInfo.php index c3a8ed55dde44..11604a2efa240 100644 --- a/src/Symfony/Component/Finder/SplFileInfo.php +++ b/src/Symfony/Component/Finder/SplFileInfo.php @@ -74,8 +74,11 @@ public function getFilenameWithoutExtension(): string public function getContents() { set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $content = file_get_contents($this->getPathname()); - restore_error_handler(); + try { + $content = file_get_contents($this->getPathname()); + } finally { + restore_error_handler(); + } if (false === $content) { throw new \RuntimeException($error); } diff --git a/src/Symfony/Component/HttpFoundation/File/File.php b/src/Symfony/Component/HttpFoundation/File/File.php index 28867cf336485..d941577d25982 100644 --- a/src/Symfony/Component/HttpFoundation/File/File.php +++ b/src/Symfony/Component/HttpFoundation/File/File.php @@ -93,8 +93,11 @@ public function move(string $directory, string $name = null) $target = $this->getTargetFile($directory, $name); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $renamed = rename($this->getPathname(), $target); - restore_error_handler(); + try { + $renamed = rename($this->getPathname(), $target); + } finally { + restore_error_handler(); + } if (!$renamed) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); } diff --git a/src/Symfony/Component/HttpFoundation/File/UploadedFile.php b/src/Symfony/Component/HttpFoundation/File/UploadedFile.php index 183197caaa2cb..5cfe8c4c27543 100644 --- a/src/Symfony/Component/HttpFoundation/File/UploadedFile.php +++ b/src/Symfony/Component/HttpFoundation/File/UploadedFile.php @@ -182,8 +182,11 @@ public function move(string $directory, string $name = null) $target = $this->getTargetFile($directory, $name); set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $moved = move_uploaded_file($this->getPathname(), $target); - restore_error_handler(); + try { + $moved = move_uploaded_file($this->getPathname(), $target); + } finally { + restore_error_handler(); + } if (!$moved) { throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); } diff --git a/src/Symfony/Component/HttpKernel/Tests/EventListener/DebugHandlersListenerTest.php b/src/Symfony/Component/HttpKernel/Tests/EventListener/DebugHandlersListenerTest.php index c9209ee033b51..c8581927a86a5 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/DebugHandlersListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/DebugHandlersListenerTest.php @@ -50,9 +50,10 @@ public function testConfigure() try { $listener->configure(); } catch (\Exception $exception) { + } finally { + restore_exception_handler(); + restore_error_handler(); } - restore_exception_handler(); - restore_error_handler(); if (null !== $exception) { throw $exception; @@ -116,9 +117,10 @@ public function testConsoleEvent() try { $dispatcher->dispatch($event, ConsoleEvents::COMMAND); } catch (\Exception $exception) { + } finally { + restore_exception_handler(); + restore_error_handler(); } - restore_exception_handler(); - restore_error_handler(); if (null !== $exception) { throw $exception; diff --git a/src/Symfony/Component/Lock/Store/FlockStore.php b/src/Symfony/Component/Lock/Store/FlockStore.php index a5c24183b7aa1..c476fd3120ae3 100644 --- a/src/Symfony/Component/Lock/Store/FlockStore.php +++ b/src/Symfony/Component/Lock/Store/FlockStore.php @@ -106,15 +106,18 @@ private function lock(Key $key, bool $read, bool $blocking) // Silence error reporting set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - if (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) { - if ($handle = fopen($fileName, 'x')) { - chmod($fileName, 0666); - } elseif (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) { - usleep(100); // Give some time for chmod() to complete - $handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r'); + try { + if (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) { + if ($handle = fopen($fileName, 'x')) { + chmod($fileName, 0666); + } elseif (!$handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r')) { + usleep(100); // Give some time for chmod() to complete + $handle = fopen($fileName, 'r+') ?: fopen($fileName, 'r'); + } } + } finally { + restore_error_handler(); } - restore_error_handler(); } if (!$handle) { diff --git a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php index 3c36225e183a6..ba8ebfd20e8ab 100644 --- a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php +++ b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php @@ -537,11 +537,13 @@ public function testDeprecationMessages(\Closure $configureOptions, array $optio }); $e = error_reporting(0); - $configureOptions($this->resolver); - $this->resolver->resolve($options); - - error_reporting($e); - restore_error_handler(); + try { + $configureOptions($this->resolver); + $this->resolver->resolve($options); + } finally { + error_reporting($e); + restore_error_handler(); + } $lastError = error_get_last(); unset($lastError['file'], $lastError['line']); diff --git a/src/Symfony/Component/Routing/Matcher/Dumper/StaticPrefixCollection.php b/src/Symfony/Component/Routing/Matcher/Dumper/StaticPrefixCollection.php index d61282bd3d169..97bd692a5e282 100644 --- a/src/Symfony/Component/Routing/Matcher/Dumper/StaticPrefixCollection.php +++ b/src/Symfony/Component/Routing/Matcher/Dumper/StaticPrefixCollection.php @@ -151,40 +151,43 @@ private function getCommonPrefix(string $prefix, string $anotherPrefix): array $staticLength = null; set_error_handler([__CLASS__, 'handleError']); - for ($i = $baseLength; $i < $end && $prefix[$i] === $anotherPrefix[$i]; ++$i) { - if ('(' === $prefix[$i]) { - $staticLength = $staticLength ?? $i; - for ($j = 1 + $i, $n = 1; $j < $end && 0 < $n; ++$j) { - if ($prefix[$j] !== $anotherPrefix[$j]) { - break 2; + try { + for ($i = $baseLength; $i < $end && $prefix[$i] === $anotherPrefix[$i]; ++$i) { + if ('(' === $prefix[$i]) { + $staticLength = $staticLength ?? $i; + for ($j = 1 + $i, $n = 1; $j < $end && 0 < $n; ++$j) { + if ($prefix[$j] !== $anotherPrefix[$j]) { + break 2; + } + if ('(' === $prefix[$j]) { + ++$n; + } elseif (')' === $prefix[$j]) { + --$n; + } elseif ('\\' === $prefix[$j] && (++$j === $end || $prefix[$j] !== $anotherPrefix[$j])) { + --$j; + break; + } } - if ('(' === $prefix[$j]) { - ++$n; - } elseif (')' === $prefix[$j]) { - --$n; - } elseif ('\\' === $prefix[$j] && (++$j === $end || $prefix[$j] !== $anotherPrefix[$j])) { - --$j; + if (0 < $n) { break; } - } - if (0 < $n) { - break; - } - if (('?' === ($prefix[$j] ?? '') || '?' === ($anotherPrefix[$j] ?? '')) && ($prefix[$j] ?? '') !== ($anotherPrefix[$j] ?? '')) { - break; - } - $subPattern = substr($prefix, $i, $j - $i); - if ($prefix !== $anotherPrefix && !preg_match('/^\(\[[^\]]++\]\+\+\)$/', $subPattern) && !preg_match('{(?> 6) && preg_match('//u', $prefix.' '.$anotherPrefix)) { do { // Prevent cutting in the middle of an UTF-8 characters diff --git a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php index 73e6d65531f91..daff53cddb714 100644 --- a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php +++ b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php @@ -298,11 +298,11 @@ protected function refreshUser(TokenInterface $token): ?TokenInterface private function safelyUnserialize(string $serializedToken) { - $e = $token = null; + $token = null; $prevUnserializeHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler) { if (__FILE__ === $file) { - throw new \ErrorException($msg, 0x37313bc, $type, $file, $line); + throw new \ErrorException($msg, 0x37313BC, $type, $file, $line); } return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; @@ -310,17 +310,16 @@ private function safelyUnserialize(string $serializedToken) try { $token = unserialize($serializedToken); - } catch (\Throwable $e) { - } - restore_error_handler(); - ini_set('unserialize_callback_func', $prevUnserializeHandler); - if ($e) { - if (!$e instanceof \ErrorException || 0x37313bc !== $e->getCode()) { + } catch (\ErrorException $e) { + if (0x37313BC !== $e->getCode()) { throw $e; } if ($this->logger) { $this->logger->warning('Failed to unserialize the security token from the session.', ['key' => $this->sessionKey, 'received' => $serializedToken, 'exception' => $e]); } + } finally { + restore_error_handler(); + ini_set('unserialize_callback_func', $prevUnserializeHandler); } return $token; @@ -388,7 +387,7 @@ private static function hasUserChanged($originalUser, TokenInterface $refreshedT */ public static function handleUnserializeCallback(string $class) { - throw new \ErrorException('Class not found: '.$class, 0x37313bc); + throw new \ErrorException('Class not found: '.$class, 0x37313BC); } /**