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