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 = "&#0</a>";

+		XMLDocument doc;

+		doc.Parse( xml );

+

+		XMLPrinter printer;

+		doc.Print( &printer );

+	}

+

 	// ----------- Performance tracking --------------

 	{

 #if defined( _MSC_VER )