[BUGFIX] Error handler callback causes fatal error for parse time errors
authorMarcus Krause <marcus@t3sec.info>
Sat, 22 Sep 2012 12:09:36 +0000 (14:09 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 22 Sep 2012 16:20:01 +0000 (18:20 +0200)
TYPO3's error handler callback t3lib_error_ErrorHandler::handleError()
causes a fatal error for PHP parse time errors.

If an error occurs during parse time (like E_DEPRECATED due to
deprecated $foo =& stdClass() code), autoloading is not available
and such PHP standard class 'Exception' (extended by t3lib_exception)
is not resolvable.
This results in a fatal and misleading error
'Class "Exception" not found'
together with a not useful backtrace. Additionally this behaviour
hides the original causing error (deprecated code).

Change-Id: I4ab97c1bf2d888022369f2095285cecc5a4c54a4
Fixes: #31834
Related: #31827
Releases: 4.5, 4.6, 4.7, 6.0
Reviewed-on: http://review.typo3.org/6683
Reviewed-by: Philipp Gampe
Reviewed-by: Markus Klein
Tested-by: Markus Klein
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
typo3/sysext/core/Classes/Error/ErrorHandler.php

index e028d31..26ce5a9 100644 (file)
@@ -87,10 +87,18 @@ class ErrorHandler implements \TYPO3\CMS\Core\Error\ErrorHandlerInterface {
                        E_USER_WARNING => 'User Warning',
                        E_USER_NOTICE => 'User Notice',
                        E_STRICT => 'Runtime Notice',
-                       E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
+                       E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
+                       E_DEPRECATED => 'Runtime Deprecation Notice'
                );
                $message = 'PHP ' . $errorLevels[$errorLevel] . ': ' . $errorMessage . ' in ' . $errorFile . ' line ' . $errorLine;
                if ($errorLevel & $this->exceptionalErrors) {
+                               // handle error raised at early parse time
+                               // autoloader not available & built-in classes not resolvable
+                       if (!class_exists('stdClass', FALSE)) {
+                               $message = 'PHP ' . $errorLevels[$errorLevel] . ': ' . $errorMessage . ' in ' . basename($errorFile) .
+                                       'line ' . $errorLine;
+                               die($message);
+                       }
                        // We need to manually require the exception classes in case the autoloader is not available at this point yet.
                        // @see http://forge.typo3.org/issues/23444
                        if (!class_exists('TYPO3\\CMS\\Core\\Error\\Exception', FALSE)) {