| Description: TinyXML incorrectly encodes text element containing |
| an ampersand followed by either x or #. |
| |
| Origin: http://sourceforge.net/tracker/index.php?func=detail&aid=3031828&group_id=13559&atid=313559 |
| |
| Upstream-Status: Pending |
| |
| diff -u -r1.105 tinyxml.cpp |
| --- a/tinyxml.cpp |
| +++ b/tinyxml.cpp |
| @@ -57,30 +57,7 @@ |
| { |
| unsigned char c = (unsigned char) str[i]; |
| |
| - if ( c == '&' |
| - && i < ( (int)str.length() - 2 ) |
| - && str[i+1] == '#' |
| - && str[i+2] == 'x' ) |
| - { |
| - // Hexadecimal character reference. |
| - // Pass through unchanged. |
| - // © -- copyright symbol, for example. |
| - // |
| - // The -1 is a bug fix from Rob Laveaux. It keeps |
| - // an overflow from happening if there is no ';'. |
| - // There are actually 2 ways to exit this loop - |
| - // while fails (error case) and break (semicolon found). |
| - // However, there is no mechanism (currently) for |
| - // this function to return an error. |
| - while ( i<(int)str.length()-1 ) |
| - { |
| - outString->append( str.c_str() + i, 1 ); |
| - ++i; |
| - if ( str[i] == ';' ) |
| - break; |
| - } |
| - } |
| - else if ( c == '&' ) |
| + if ( c == '&' ) |
| { |
| outString->append( entity[0].str, entity[0].strLength ); |
| ++i; |
| diff -u -r1.89 xmltest.cpp |
| --- a/xmltest.cpp |
| +++ b/xmltest.cpp |
| @@ -1340,6 +1340,16 @@ |
| }*/ |
| } |
| |
| + #ifdef TIXML_USE_STL |
| + { |
| + TiXmlDocument xml; |
| + xml.Parse("<foo>foo&#xa+bar</foo>"); |
| + std::string str; |
| + str << xml; |
| + XmlTest( "Entity escaping", "<foo>foo&#xa+bar</foo>", str.c_str() ); |
| + } |
| + #endif |
| + |
| /* 1417717 experiment |
| { |
| TiXmlDocument xml; |