You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by bl...@apache.org on 2003/11/27 10:59:50 UTC
cvs commit: xml-security/c/src/utils XSECSafeBufferFormatter.cpp XSECSafeBufferFormatter.hpp
blautenb 2003/11/27 01:59:50
Modified: c/src/canon XSECC14n20010315.cpp XSECC14n20010315.hpp
c/src/utils XSECSafeBufferFormatter.cpp
XSECSafeBufferFormatter.hpp
Log:
Fix for Canonicalisation bug reported by Milan Tomic (Strings over 16K get truncated)
Revision Changes Path
1.13 +38 -91 xml-security/c/src/canon/XSECC14n20010315.cpp
Index: XSECC14n20010315.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/canon/XSECC14n20010315.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XSECC14n20010315.cpp 11 Sep 2003 11:14:57 -0000 1.12
+++ XSECC14n20010315.cpp 27 Nov 2003 09:59:49 -0000 1.13
@@ -71,9 +71,10 @@
//XSEC includes
#include <xsec/framework/XSECDefs.hpp>
+#include <xsec/framework/XSECError.hpp>
#include <xsec/canon/XSECC14n20010315.hpp>
-#include <xsec/framework/XSECException.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
+#include <xsec/utils/XSECSafeBufferFormatter.hpp>
// Xerces includes
#include <xercesc/dom/DOMNamedNodeMap.hpp>
@@ -117,28 +118,6 @@
// Some useful utilities
// --------------------------------------------------------------------------------
-/*
-
- Removed - During conversion to DOMNode * (Xerces 2.1)
-
-XMLFormatter& operator<< (XMLFormatter& strm, const XMLCh * s)
-{
- unsigned int lent = s.length();
-
- if (lent <= 0)
- lent = 0;
-
- XMLCh* buf = new XMLCh[lent + 1];
- if (lent > 0)
- XMLString::copyNString(buf, s.rawBuffer(), lent);
- buf[lent] = 0;
- strm << buf;
- delete [] buf;
- return strm;
-}
-
-*/
-
// Find a node in an XSECNodeList
bool NodeInList(const XSECNodeListElt * lst, const DOMNode * toFind) {
@@ -354,17 +333,8 @@
// Set up the Xerces formatter
- c14ntarget = new c14nFormatTarget();
- c14ntarget->setBuffer(&formatBuffer);
-
-#if defined(XSEC_XERCES_FORMATTER_REQUIRES_VERSION)
- formatter = new XMLFormatter("UTF-8", 0, c14ntarget, XMLFormatter::NoEscapes,
- XMLFormatter::UnRep_CharRef);
-#else
- formatter = new XMLFormatter("UTF-8", c14ntarget, XMLFormatter::NoEscapes,
- XMLFormatter::UnRep_CharRef);
-#endif
- formatBuffer.setBufferType(safeBuffer::BUFFER_CHAR);
+ XSECnew(mp_formatter, XSECSafeBufferFormatter("UTF-8",XMLFormatter::NoEscapes,
+ XMLFormatter::UnRep_CharRef));
// Set up for first attribute list
@@ -411,11 +381,8 @@
XSECC14n20010315::~XSECC14n20010315() {
- if (formatter != NULL)
- delete formatter;
-
- if (c14ntarget != NULL)
- delete c14ntarget;
+ if (mp_formatter != NULL)
+ delete mp_formatter;
// Clear out the exclusive namespace list
int size = m_exclNSList.size();
@@ -756,10 +723,7 @@
processAsExclusive = m_exclusiveDefault;
}
else {
- formatBuffer[0] = '\0';
- *formatter << a->getLocalName();
- localName.sbStrcpyIn(formatBuffer);
-
+ localName << (*mp_formatter << a->getLocalName());
processAsExclusive = !inNonExclNSList(localName);
}
@@ -772,9 +736,7 @@
return false;
// Is the name space visibly utilised?
- formatBuffer[0] = '\0';
- *formatter << a->getLocalName();
- localName.sbStrcpyIn(formatBuffer);
+ localName << (*mp_formatter << a->getLocalName());
if (localName.sbStrcmp("xmlns") == 0)
localName[0] = '\0'; // Is this correct or should Xerces return "" for default?
@@ -893,7 +855,6 @@
}
// Always zeroise buffers to make work simpler
- formatBuffer[0] = '\0';
m_bufferLength = m_bufferPoint = 0;
m_buffer.sbStrcpyIn("");
@@ -966,15 +927,13 @@
else
m_buffer.sbStrcpyIn("<?");
- *formatter << mp_nextNode->getNodeName();
- m_buffer.sbStrcatIn(formatBuffer);
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeName());
+ m_buffer.sbStrcatIn(m_formatBuffer);
- //*formatter << mp_nextNode.getNodeValue();
- formatBuffer[0] = '\0';
- *formatter << ((DOMProcessingInstruction *) mp_nextNode)->getData();
- if (formatBuffer.sbStrlen() > 0) {
+ m_formatBuffer << (*mp_formatter << ((DOMProcessingInstruction *) mp_nextNode)->getData());
+ if (m_formatBuffer.sbStrlen() > 0) {
m_buffer.sbStrcatIn(" ");
- m_buffer.sbStrcatIn(formatBuffer);
+ m_buffer.sbStrcatIn(m_formatBuffer);
}
m_buffer.sbStrcatIn("?>");
@@ -1005,11 +964,10 @@
else
m_buffer.sbStrcpyIn("<!--");
- formatBuffer[0] = '\0';
- *formatter << mp_nextNode->getNodeValue();
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeValue());
- if (formatBuffer.sbStrlen() > 0) {
- m_buffer.sbStrcatIn(formatBuffer);
+ if (m_formatBuffer.sbStrlen() > 0) {
+ m_buffer.sbStrcatIn(m_formatBuffer);
}
m_buffer.sbStrcatIn("-->");
@@ -1030,11 +988,11 @@
case DOMNode::TEXT_NODE : // Straight copy for now
if (processNode) {
- *formatter << mp_nextNode->getNodeValue();
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeValue());
// Do c14n cleaning on the text string
- m_buffer = c14nCleanText(formatBuffer);
+ m_buffer = c14nCleanText(m_formatBuffer);
}
@@ -1049,8 +1007,8 @@
if (m_returnedFromChild) {
if (processNode) {
m_buffer.sbStrcpyIn ("</");
- *formatter << mp_nextNode->getNodeName();
- m_buffer.sbStrcatIn(formatBuffer);
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeName());
+ m_buffer.sbStrcatIn(m_formatBuffer);
m_buffer.sbStrcatIn(">");
}
@@ -1060,8 +1018,8 @@
if (processNode) {
m_buffer.sbStrcpyIn("<");
- *formatter << mp_nextNode->getNodeName();
- m_buffer.sbStrcatIn(formatBuffer);
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeName());
+ m_buffer.sbStrcatIn(m_formatBuffer);
}
// We now set up for attributes and name spaces
@@ -1089,13 +1047,8 @@
for (i = 0; i < size; ++i) {
// Get the name and value of the attribute
- formatBuffer[0] = '\0';
- *formatter << tmpAtts->item(i)->getNodeName();
- currentName.sbStrcpyIn(formatBuffer);
-
- formatBuffer[0] = '\0';
- *formatter << tmpAtts->item(i)->getNodeValue();
- currentValue.sbStrcpyIn(formatBuffer);
+ currentName << (*mp_formatter << tmpAtts->item(i)->getNodeName());
+ currentValue << (*mp_formatter << tmpAtts->item(i)->getNodeValue());
// Build the string used to sort this node
@@ -1112,9 +1065,9 @@
// Add to the list
- *formatter << tmpAtts->item(i)->getNodeName();
- if (formatBuffer[5] == ':')
- currentName.sbStrcpyIn((char *) &formatBuffer[6]);
+ m_formatBuffer << (*mp_formatter << tmpAtts->item(i)->getNodeName());
+ if (m_formatBuffer[5] == ':')
+ currentName.sbStrcpyIn((char *) &m_formatBuffer[6]);
else
currentName.sbStrcpyIn("");
@@ -1203,14 +1156,14 @@
toIns->sortString.sbStrcatIn(NOURI_PREFIX);
}
else {
- *formatter << nsURI;
+ m_formatBuffer << (*mp_formatter << nsURI);
toIns->sortString.sbStrcatIn(HAVEURI_PREFIX);
- toIns->sortString.sbStrcatIn(formatBuffer);
+ toIns->sortString.sbStrcatIn(m_formatBuffer);
}
// Append the local name as the secondary key
- *formatter << tmpAtts->item(i)->getLocalName();
- toIns->sortString.sbStrcatIn(formatBuffer);
+ m_formatBuffer << (*mp_formatter << tmpAtts->item(i)->getLocalName());
+ toIns->sortString.sbStrcatIn(m_formatBuffer);
// Insert node
mp_attributes = insertNodeIntoList(mp_attributes, toIns);
@@ -1301,13 +1254,8 @@
for (int i = 0; i < size; ++i) {
- formatBuffer[0] = '\0';
- *formatter << tmpAtts->item(i)->getNodeName();
- currentName.sbStrcpyIn(formatBuffer);
-
- formatBuffer[0] = '\0';
- *formatter << tmpAtts->item(i)->getNodeValue();
- currentValue.sbStrcpyIn(formatBuffer);
+ currentName << (*mp_formatter << tmpAtts->item(i)->getNodeName());
+ currentValue << (*mp_formatter << tmpAtts->item(i)->getNodeValue());
if ((currentName.sbStrcmp("xmlns") == 0) &&
(currentValue.sbStrcmp("") != 0) &&
@@ -1367,14 +1315,13 @@
if (mp_nextNode != 0) {
- *formatter << mp_nextNode->getNodeName();
- m_buffer.sbStrcatIn(formatBuffer);
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeName());
+ m_buffer.sbStrcatIn(m_formatBuffer);
m_buffer.sbStrcatIn("=\"");
- formatBuffer[0] = '\0';
- *formatter << mp_nextNode->getNodeValue();
- sbWork = c14nCleanAttribute(formatBuffer);
+ m_formatBuffer << (*mp_formatter << mp_nextNode->getNodeValue());
+ sbWork = c14nCleanAttribute(m_formatBuffer);
m_buffer.sbStrcatIn(sbWork);
m_buffer.sbStrcatIn("\"");
1.6 +4 -48 xml-security/c/src/canon/XSECC14n20010315.hpp
Index: XSECC14n20010315.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/canon/XSECC14n20010315.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XSECC14n20010315.hpp 11 Sep 2003 11:14:57 -0000 1.5
+++ XSECC14n20010315.hpp 27 Nov 2003 09:59:49 -0000 1.6
@@ -87,50 +87,7 @@
XSEC_USING_XERCES(XMLFormatter);
XSEC_USING_XERCES(XMLFormatTarget);
-// --------------------------------------------------------------------------------
-// Object definitions needed for formatting Xerces objects
-// --------------------------------------------------------------------------------
-
-
-class c14nFormatTarget : public XMLFormatTarget
-{
-public:
-
- safeBuffer * buffer; // Buffer to write to
-
- c14nFormatTarget() {};
- ~c14nFormatTarget() {};
-
- void setBuffer (safeBuffer * toSet) {buffer = toSet;};
-
-
- // -----------------------------------------------------------------------
- // Implementations of the format target interface
- // -----------------------------------------------------------------------
-
- void writeChars(const XMLByte* const toWrite,
- const unsigned int count,
- XMLFormatter * const formatter)
- {
- // Surprisingly, Solaris was the only platform on which
- // required the char* cast to print out the string correctly.
- // Without the cast, it was pinting the pointer value in hex.
- // Quite annoying, considering every other platform printed
- // the string with the explicit cast to char* below.
- buffer->sbMemcpyIn((char *) toWrite, (int) count);
- (*buffer)[count] = '\0';
- buffer->setBufferType(safeBuffer::BUFFER_CHAR);
- };
-
-private:
- // -----------------------------------------------------------------------
- // Unimplemented methods.
- // -----------------------------------------------------------------------
- c14nFormatTarget(const c14nFormatTarget& other);
- void operator=(const c14nFormatTarget& rhs);
-
-
-};
+class XSECSafeBufferFormatter;
// --------------------------------------------------------------------------------
// Simple structure for holding a list of nodes
@@ -215,9 +172,8 @@
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *a);
// For formatting the buffers
- c14nFormatTarget *c14ntarget;
- XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter *formatter;
- safeBuffer formatBuffer;
+ XSECSafeBufferFormatter * mp_formatter;
+ safeBuffer m_formatBuffer;
// For holding state whilst walking the DOM tree
XSECNodeListElt * mp_attributes, // Start of list
1.8 +3 -29 xml-security/c/src/utils/XSECSafeBufferFormatter.cpp
Index: XSECSafeBufferFormatter.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/utils/XSECSafeBufferFormatter.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XSECSafeBufferFormatter.cpp 11 Sep 2003 11:11:05 -0000 1.7
+++ XSECSafeBufferFormatter.cpp 27 Nov 2003 09:59:49 -0000 1.8
@@ -151,8 +151,7 @@
XSECSafeBufferFormatter& XSECSafeBufferFormatter::operator<< (const XMLCh *const toFormat) {
- formatBuffer[0] = '\0';
-
+ sbf->reset();
*formatter << toFormat;
return *this;
@@ -162,6 +161,7 @@
XSECSafeBufferFormatter&
XSECSafeBufferFormatter::operator<< (const XMLCh toFormat) {
+ sbf->reset();
*formatter << toFormat;
return *this;
@@ -209,29 +209,3 @@
}
-/*
-
-XSECSafeBufferFormatter& XSECSafeBufferFormatter::operator<< (const DOMString &s) {
-
- // Clear out buffer
- formatBuffer[0] = '\0';
-
- unsigned int lent = s.length();
-
- if (lent <= 0)
- lent = 0;
-
- XMLCh* buf = new XMLCh[lent + 1];
-
- if (lent > 0)
- XMLString::copyNString(buf, s.rawBuffer(), lent);
-
- buf[lent] = 0;
- *(this) << buf;
-
- delete [] buf;
-
- return *this;
-}
-
-*/
1.7 +13 -10 xml-security/c/src/utils/XSECSafeBufferFormatter.hpp
Index: XSECSafeBufferFormatter.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/utils/XSECSafeBufferFormatter.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- XSECSafeBufferFormatter.hpp 11 Sep 2003 11:11:05 -0000 1.6
+++ XSECSafeBufferFormatter.hpp 27 Nov 2003 09:59:49 -0000 1.7
@@ -87,12 +87,10 @@
{
public:
- safeBuffer * buffer; // Buffer to write to
+ sbFormatTarget() {m_offset = 0;}
+ ~sbFormatTarget() {}
- sbFormatTarget() {};
- ~sbFormatTarget() {};
-
- void setBuffer (safeBuffer * toSet) {buffer = toSet;};
+ void setBuffer (safeBuffer * toSet) {m_buffer = toSet;};
// -----------------------------------------------------------------------
@@ -104,16 +102,21 @@
const unsigned int count,
XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter * const formatter)
{
- buffer->sbMemcpyIn((char *) toWrite, (int) count);
- buffer->setBufferType(safeBuffer::BUFFER_CHAR);
- (*buffer)[count] = '\0';
+ m_buffer->sbMemcpyIn(m_offset, (char *) toWrite, (int) count);
+ m_buffer->setBufferType(safeBuffer::BUFFER_CHAR);
+ m_offset += count;
+ (*m_buffer)[m_offset] = '\0';
};
+ void reset(void) {m_offset = 0;(*m_buffer)[0] = '\0';}
+
private:
sbFormatTarget(const sbFormatTarget& other);
void operator=(const sbFormatTarget& rhs);
+ safeBuffer * m_buffer; // Buffer to write to
+ unsigned int m_offset;
};
@@ -180,7 +183,6 @@
XSECSafeBufferFormatter& operator<< (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::EscapeFlags newFlags);
XSECSafeBufferFormatter& operator<< (const XERCES_CPP_NAMESPACE_QUALIFIER XMLFormatter::UnRepFlags newFlags);
- //XSECSafeBufferFormatter& operator<< (const DOMString &s);
// Friends for working with safestrings
@@ -192,6 +194,7 @@
XSECSafeBufferFormatter() {};
+
};
/** @} */