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 */
 
 }