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

Reply via email to