diff --git a/tinyxml2.cpp b/tinyxml2.cpp index a8a4a20..dcf2a43 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -911,6 +911,13 @@ XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ) TIXMLASSERT( false ); return 0; } + if ( afterThis == addThis ) { + // Current state: BeforeThis -> AddThis -> OneAfterAddThis + // Now AddThis must disappear from it's location and then + // reappear between BeforeThis and OneAfterAddThis. + // So just leave it where it is. + return addThis; + } if ( afterThis->_next == 0 ) { // The last node or the only node. diff --git a/xmltest.cpp b/xmltest.cpp index 18e2491..75c28e5 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -385,6 +385,34 @@ int main( int argc, const char ** argv ) doc.Print(); } + { + // This test is pre-test for the next one + // (where Element1 is inserted "after itself". + // This code didn't use to crash. + XMLDocument doc; + XMLElement* element1 = doc.NewElement("Element1"); + XMLElement* element2 = doc.NewElement("Element2"); + doc.InsertEndChild(element1); + doc.InsertEndChild(element2); + doc.InsertAfterChild(element2, element2); + doc.InsertAfterChild(element2, element2); + } + + { + XMLDocument doc; + XMLElement* element1 = doc.NewElement("Element1"); + XMLElement* element2 = doc.NewElement("Element2"); + doc.InsertEndChild(element1); + doc.InsertEndChild(element2); + + // This insertion "after itself" + // used to cause invalid memory access and crash + doc.InsertAfterChild(element1, element1); + doc.InsertAfterChild(element1, element1); + doc.InsertAfterChild(element2, element2); + doc.InsertAfterChild(element2, element2); + } + { static const char* test = "Text before."; XMLDocument doc;