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