From 1dbe88a640e9deb91794494d0bf488a748124588 Mon Sep 17 00:00:00 2001 From: Sascha Egerer <sascha@sascha-egerer.de> Date: Wed, 25 Oct 2023 21:54:51 +0200 Subject: [PATCH] [BUGFIX] Make ContentRenderer catch more errors The ContentObjectRenderer catches \Exception's that occur during the rendering of a content element. However, since PHP 7, there is a \TypeError exception that occurs, for example, if the given type does not match the declared type. Because \TypeError is not a subtype of \Exception, these errors are not caught in the production context, and instead of not rendering a single content element, the whole page is not rendered. Since all types of \Throwable are essentially errors that will interrupt the rendering process, the catch block must accommodate all of these, not just implementations of \Exception. Resolves: #102044 Releases: main, 12.4, 11.5 Change-Id: If6218f013caf21d7fcd2c0d0d5b6b51c3bf9963e Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/84757 Tested-by: Benni Mack <benni@typo3.org> Tested-by: core-ci <typo3@b13.com> Reviewed-by: Benni Mack <benni@typo3.org> --- .../Classes/ContentObject/ContentObjectRenderer.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php index e396788a6202..f03324cc2394 100644 --- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php +++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php @@ -817,11 +817,16 @@ class ContentObjectRenderer implements LoggerAwareInterface // Content rendering Exceptions indicate a critical problem which should not be // caught e.g. when something went wrong with Exception handling itself throw $exception; - } catch (\Exception $exception) { + } catch (\Throwable $exception) { $exceptionHandler = $this->createExceptionHandler($configuration); if ($exceptionHandler === null) { throw $exception; } + // Ensure that the exception handler receives an \Exception instance, + // which is required by the \ExceptionHandlerInterface. + if (!$exception instanceof \Exception) { + $exception = new \Exception($exception->getMessage(), 1698347363, $exception); + } $content = $exceptionHandler->handle($exception, $contentObject, $configuration); } -- GitLab