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() {};
   
  +	
   };
   
   /** @} */