diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 3c0eef3..cefd22d 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -887,6 +887,17 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd ) break; } + XMLDeclaration* decl = node->ToDeclaration(); + if ( decl ) { + // A declaration can only be the first child of a document. + // Set error, if document already has children. + if ( !_document->NoChildren() ) { + _document->SetError( XML_ERROR_PARSING_DECLARATION, decl->Value(), 0); + DeleteNode( decl ); + break; + } + } + XMLElement* ele = node->ToElement(); if ( ele ) { // We read the end tag. Return it to the parent. @@ -1846,7 +1857,7 @@ XMLError XMLDocument::LoadFile( FILE* fp ) return _errorID; } - if ( filelength >= (size_t)-1 ) { + if ( (size_t)filelength >= (size_t)-1 ) { // Cannot handle files which won't fit in buffer together with null terminator SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; diff --git a/xmltest.cpp b/xmltest.cpp index b70fc51..f3fa7b2 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1460,6 +1460,25 @@ int main( int argc, const char ** argv ) XMLTest( "Error should be cleared", false, doc.Error() ); } + { + // Check that declarations are parsed only as the FirstChild + const char* xml0 = "" + " " + ""; + const char* xml1 = "" + " " + ""; + const char* xml2 = "" + ""; + XMLDocument doc; + doc.Parse(xml0); + XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false); + doc.Parse(xml1); + XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); + doc.Parse(xml2); + XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); + } + // ----------- Performance tracking -------------- { #if defined( _MSC_VER )