Resolve crash when printing malformed entities - issue 291
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index ef00f13..3d7e2d1 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -228,11 +228,19 @@
const int buflen = 10;
char buf[buflen] = { 0 };
int len = 0;
- p = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
- TIXMLASSERT( 0 <= len && len <= buflen );
- TIXMLASSERT( q + len <= p );
- memcpy( q, buf, len );
- q += len;
+ char* adjusted = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
+ if ( adjusted == 0 ) {
+ *q = *p;
+ ++p;
+ ++q;
+ }
+ else {
+ TIXMLASSERT( 0 <= len && len <= buflen );
+ TIXMLASSERT( q + len <= adjusted );
+ p = adjusted;
+ memcpy( q, buf, len );
+ q += len;
+ }
}
else {
int i=0;
diff --git a/xmltest.cpp b/xmltest.cpp
index c231024..243628c 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -1416,6 +1416,16 @@
XMLPrinter printer;
}
+ {
+ // Issue 291. Should not crash
+ const char* xml = "�</a>";
+ XMLDocument doc;
+ doc.Parse( xml );
+
+ XMLPrinter printer;
+ doc.Print( &printer );
+ }
+
// ----------- Performance tracking --------------
{
#if defined( _MSC_VER )