blob: b801506eaeaf23bfeed63146f07052a171419d0a [file] [log] [blame]
Patrick Williamsb48b7b42016-08-17 15:04:38 -05001Description: TinyXML incorrectly encodes text element containing
2 an ampersand followed by either x or #.
3
4Origin: http://sourceforge.net/tracker/index.php?func=detail&aid=3031828&group_id=13559&atid=313559
5
6Upstream-Status: Pending
7
8diff -u -r1.105 tinyxml.cpp
9--- a/tinyxml.cpp
10+++ b/tinyxml.cpp
11@@ -57,30 +57,7 @@
12 {
13 unsigned char c = (unsigned char) str[i];
14
15- if ( c == '&'
16- && i < ( (int)str.length() - 2 )
17- && str[i+1] == '#'
18- && str[i+2] == 'x' )
19- {
20- // Hexadecimal character reference.
21- // Pass through unchanged.
22- // &#xA9; -- copyright symbol, for example.
23- //
24- // The -1 is a bug fix from Rob Laveaux. It keeps
25- // an overflow from happening if there is no ';'.
26- // There are actually 2 ways to exit this loop -
27- // while fails (error case) and break (semicolon found).
28- // However, there is no mechanism (currently) for
29- // this function to return an error.
30- while ( i<(int)str.length()-1 )
31- {
32- outString->append( str.c_str() + i, 1 );
33- ++i;
34- if ( str[i] == ';' )
35- break;
36- }
37- }
38- else if ( c == '&' )
39+ if ( c == '&' )
40 {
41 outString->append( entity[0].str, entity[0].strLength );
42 ++i;
43diff -u -r1.89 xmltest.cpp
44--- a/xmltest.cpp
45+++ b/xmltest.cpp
46@@ -1340,6 +1340,16 @@
47 }*/
48 }
49
50+ #ifdef TIXML_USE_STL
51+ {
52+ TiXmlDocument xml;
53+ xml.Parse("<foo>foo&amp;#xa+bar</foo>");
54+ std::string str;
55+ str << xml;
56+ XmlTest( "Entity escaping", "<foo>foo&amp;#xa+bar</foo>", str.c_str() );
57+ }
58+ #endif
59+
60 /* 1417717 experiment
61 {
62 TiXmlDocument xml;