From e402a092a5e2fbf624947896b013d405efb75049 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Thu, 29 May 2014 23:01:36 +0200 Subject: Fixed error handling of invalid XSL transformations * xalan is segfaulting in XalanDOMString constructor when the static member "XalanLocator::getSystemId" is returning null-pointer ** this should seemingly be handled by passing a pointer to the static constant m_dummy but this sadly fails to prevent the segfault ** the patch provided by this commit fixes the problem for now but I cannot guarantee that this wont cause any side effects in a other context * Adapted TransformationFacade to handle errors during transformation compilation ** errors generated during transformation compilation are returned through the generate member method ** throwing an exeception during TransformationFacade construction would require additional error handling in the calling code * Added xalan::ProblemListener functionality to the ErrorHandler class ** XSLT problems passed to the ProblemListener are returned alongside to and treated as all other transformation errors --- src/transformation_facade.cc | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) (limited to 'src/transformation_facade.cc') diff --git a/src/transformation_facade.cc b/src/transformation_facade.cc index 0f174d8..8b9e1a2 100644 --- a/src/transformation_facade.cc +++ b/src/transformation_facade.cc @@ -18,6 +18,7 @@ TransformationFacade::TransformationFacade( error_handler_() { this->transformer_.setEntityResolver(resolver); this->transformer_.setErrorHandler(&this->error_handler_); + this->transformer_.setProblemListener(&this->error_handler_); this->transformer_.compileStylesheet( xalan::XSLTInputSource(transformation.data()), @@ -66,27 +67,18 @@ auto TransformationFacade::generate( xalan::XSLTResultTarget&& outputTarget, StylesheetParameterGuard& ) -> return_type { - std::stringstream emptyStream(""); - xalan::XSLTInputSource inputSource(emptyStream); - - const int resultCode = this->transformer_.transform( - inputSource, - this->transformation_, - outputTarget - ); - - return_type errors(this->error_handler_.getCachedErrors()); - - if ( errors && resultCode != 0 ) { - errors->emplace_back( - "Transformation error with code " + - std::to_string(resultCode) + - ": " + - this->transformer_.getLastError() + if ( this->transformation_ != nullptr ) { + std::stringstream emptyStream(""); + xalan::XSLTInputSource inputSource(emptyStream); + + this->transformer_.transform( + inputSource, + this->transformation_, + outputTarget ); } - return errors; + return this->error_handler_.getCachedErrors(); } } -- cgit v1.2.3