diff --git a/lib/Cake/Error/ExceptionRenderer.php b/lib/Cake/Error/ExceptionRenderer.php index 069ed1860..9eb5b0111 100644 --- a/lib/Cake/Error/ExceptionRenderer.php +++ b/lib/Cake/Error/ExceptionRenderer.php @@ -151,12 +151,14 @@ class ExceptionRenderer { $response->header($exception->responseHeader()); } - try { - $controller = new CakeErrorController($request, $response); - $controller->startupProcess(); - } catch (Exception $e) { - if (!empty($controller) && $controller->Components->enabled('RequestHandler')) { - $controller->RequestHandler->startup($controller); + if (class_exists('AppController')) { + try { + $controller = new CakeErrorController($request, $response); + $controller->startupProcess(); + } catch (Exception $e) { + if (!empty($controller) && $controller->Components->enabled('RequestHandler')) { + $controller->RequestHandler->startup($controller); + } } } if (empty($controller)) { diff --git a/lib/Cake/Test/Case/Utility/XmlTest.php b/lib/Cake/Test/Case/Utility/XmlTest.php index 948c84c9a..a3973f0b0 100644 --- a/lib/Cake/Test/Case/Utility/XmlTest.php +++ b/lib/Cake/Test/Case/Utility/XmlTest.php @@ -187,12 +187,23 @@ class XmlTest extends CakeTestCase { * * @dataProvider invalidDataProvider * @expectedException XmlException - * return void + * @return void */ public function testBuildInvalidData($value) { Xml::build($value); } +/** + * Test that building SimpleXmlElement with invalid XML causes the right exception. + * + * @expectedException XmlException + * @return void + */ + public function testBuildInvalidDataSimpleXml() { + $input = ' 'simplexml')); + } + /** * test build with a single empty tag * diff --git a/lib/Cake/Utility/Xml.php b/lib/Cake/Utility/Xml.php index f2f149584..6b971054d 100644 --- a/lib/Cake/Utility/Xml.php +++ b/lib/Cake/Utility/Xml.php @@ -124,6 +124,7 @@ class Xml { * @param string $input The input to load. * @param array $options The options to use. See Xml::build() * @return SimpleXmlElement|DOMDocument + * @throws XmlException */ protected static function _loadXml($input, $options) { $hasDisable = function_exists('libxml_disable_entity_loader'); @@ -131,16 +132,23 @@ class Xml { if ($hasDisable && !$options['loadEntities']) { libxml_disable_entity_loader(true); } - if ($options['return'] === 'simplexml' || $options['return'] === 'simplexmlelement') { - $xml = new SimpleXMLElement($input, LIBXML_NOCDATA); - } else { - $xml = new DOMDocument(); - $xml->loadXML($input); + try { + if ($options['return'] === 'simplexml' || $options['return'] === 'simplexmlelement') { + $xml = new SimpleXMLElement($input, LIBXML_NOCDATA); + } else { + $xml = new DOMDocument(); + $xml->loadXML($input); + } + } catch (Exception $e) { + $xml = null; } if ($hasDisable && !$options['loadEntities']) { libxml_disable_entity_loader(false); } libxml_use_internal_errors($internalErrors); + if ($xml === null) { + throw new XmlException(__d('cake_dev', 'Xml cannot be read.')); + } return $xml; }