You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by sc...@apache.org on 2010/05/12 18:55:26 UTC
svn commit: r943580 - in /xml/security/trunk/c: CHANGELOG.txt
src/dsig/DSIGTransformXSL.cpp
Author: scantor
Date: Wed May 12 16:55:26 2010
New Revision: 943580
URL: http://svn.apache.org/viewvc?rev=943580&view=rev
Log:
https://issues.apache.org/bugzilla/show_bug.cgi?id=44983
Modified:
xml/security/trunk/c/CHANGELOG.txt
xml/security/trunk/c/src/dsig/DSIGTransformXSL.cpp
Modified: xml/security/trunk/c/CHANGELOG.txt
URL: http://svn.apache.org/viewvc/xml/security/trunk/c/CHANGELOG.txt?rev=943580&r1=943579&r2=943580&view=diff
==============================================================================
--- xml/security/trunk/c/CHANGELOG.txt (original)
+++ xml/security/trunk/c/CHANGELOG.txt Wed May 12 16:55:26 2010
@@ -7,6 +7,7 @@ Changes since 1.5.1
* Fix for bug#49257, stylesheet append bug (SC)
* Fix for bug#49260, header guard in XPath transform header (SC)
* Fix for bug#49264, string release crash (SC)
+* Fix for bug#44983, improper c14n of XSLT (SC)
* Expose algorithm URI on Signature and Reference objects (SC)
* White/blacklisting of otherwise registered algorithms (SC)
Modified: xml/security/trunk/c/src/dsig/DSIGTransformXSL.cpp
URL: http://svn.apache.org/viewvc/xml/security/trunk/c/src/dsig/DSIGTransformXSL.cpp?rev=943580&r1=943579&r2=943580&view=diff
==============================================================================
--- xml/security/trunk/c/src/dsig/DSIGTransformXSL.cpp (original)
+++ xml/security/trunk/c/src/dsig/DSIGTransformXSL.cpp Wed May 12 16:55:26 2010
@@ -35,8 +35,65 @@
#include <xsec/utils/XSECDOMUtils.hpp>
#include <xsec/framework/XSECError.hpp>
+#include <xercesc/dom/DOM.hpp>
+#include <xercesc/framework/MemBufFormatTarget.hpp>
+#include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/Janitor.hpp>
+
XERCES_CPP_NAMESPACE_USE
+class XSECDomToSafeBuffer {
+public:
+ XSECDomToSafeBuffer::XSECDomToSafeBuffer(DOMNode *node);
+ virtual ~XSECDomToSafeBuffer() {}
+
+ operator const safeBuffer&() const {
+ return m_buffer;
+ }
+private:
+ safeBuffer m_buffer;
+};
+
+XSECDomToSafeBuffer::XSECDomToSafeBuffer(DOMNode* node)
+{
+ static const XMLCh _LS[] = {chLatin_L, chLatin_S, chNull};
+ DOMImplementationLS* impl = DOMImplementationRegistry::getDOMImplementation(_LS);
+
+ MemBufFormatTarget* target = new MemBufFormatTarget;
+ Janitor<MemBufFormatTarget> j_target(target);
+
+#if defined (XSEC_XERCES_DOMLSSERIALIZER)
+ // DOM L3 version as per Xerces 3.0 API
+ DOMLSSerializer* theSerializer = impl->createLSSerializer();
+ Janitor<DOMLSSerializer> j_theSerializer(theSerializer);
+
+ DOMLSOutput *theOutput = impl->createLSOutput();
+ Janitor<DOMLSOutput> j_theOutput(theOutput);
+ theOutput->setByteStream(target);
+#else
+ DOMWriter* theSerializer = impl->createDOMWriter();
+ Janitor<DOMWriter> j_theSerializer(theSerializer);
+#endif
+
+ try
+ {
+#if defined (XSEC_XERCES_DOMLSSERIALIZER)
+ theSerializer->write(node, theOutput);
+#else
+ theSerializer->writeNode(target, *node);
+#endif
+ m_buffer.sbMemcpyIn(0, target->getRawBuffer(), target->getLen());
+ }
+ catch(const XMLException&)
+ {
+ throw XSECException(XSECException::UnknownError);
+ }
+ catch(const DOMException&)
+ {
+ throw XSECException(XSECException::UnknownError);
+ }
+}
+
// --------------------------------------------------------------------------------
// Constructors and Destructors
// --------------------------------------------------------------------------------
@@ -96,25 +153,9 @@ void DSIGTransformXSL::appendTransformer
XSECnew(x, TXFMXSL(mp_txfmNode->getOwnerDocument()));
input->appendTxfm(x);
- // Again use C14n (convenient) to translate to a SafeBuffer
-
- XSECC14n20010315 c14n(mp_txfmNode->getOwnerDocument(), mp_stylesheetNode);
- safeBuffer sbStyleSheet;
- unsigned int size, count;
- unsigned char buf[512];
- size = 0;
-
- while ((count = c14n.outputBuffer(buf, 512)) != 0) {
-
- sbStyleSheet.sbMemcpyIn(size, buf, count);
- size += count;
-
- }
-
- sbStyleSheet[size] = '\0'; // Terminate as though a string
-
- x->evaluateStyleSheet(sbStyleSheet);
-
+ // Patch to avoid c14n of stylesheet
+ XSECDomToSafeBuffer sbStyleSheet(mp_stylesheetNode);
+ x->evaluateStyleSheet(sbStyleSheet);
#endif /* NO_XSLT */
}