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 )