From 6fe12ebe240c7c6e0178bcbcf7119d28333b76ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20de=20la=20Pe=C3=B1a?= Date: Tue, 8 Sep 2026 07:50:01 +0100 Subject: [PATCH] fix: Load MX before instantiating the error mock controller Error views can be rendered before the MX Router registers the MX_* autoloader (e.g. URI character filtering). Nails\Common\Controller\Base extends MX_Controller, so skip that load and error rendering fatals. Fall back to halt() if the mock controller still cannot be created. --- src/Common/Service/ErrorHandler.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Common/Service/ErrorHandler.php b/src/Common/Service/ErrorHandler.php index 9d02397e..427b98ba 100644 --- a/src/Common/Service/ErrorHandler.php +++ b/src/Common/Service/ErrorHandler.php @@ -497,7 +497,16 @@ public static function renderErrorView( ); } - static::instantiateMockController(); + try { + static::instantiateMockController(); + } catch (\Throwable $e) { + static::halt( + ArrayHelper::get('sMessage', $aData) ?: $e->getMessage(), + ArrayHelper::get('sSubject', $aData), + $iCode, + $aTrace + ); + } // Flush the output buffer if ($bFlushBuffer) { @@ -670,6 +679,14 @@ protected static function instantiateMockController() require_once BASEPATH . 'core/Controller.php'; + // URI filtering (and other early failures) can occur before the MX + // Router is loaded. Nails\Common\Controller\Base extends MX_Controller, + // so the mock controller used to render error views must ensure MX is + // available. Modules.php registers the MX_* autoloader. + if (!class_exists('MX_Controller', false)) { + require_once Config::get('NAILS_COMMON_PATH') . 'MX/Modules.php'; + } + // Match pocketarc/codeigniter system/core/CodeIgniter.php: // Security requires $charset; Input requires the Security instance. $sCharset = strtoupper((string) config_item('charset'));