From 1fc549f66662f154be57ca04807f86d3df1d02c2 Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 6 Feb 2014 10:01:18 +0000 Subject: [PATCH] Fix for parsing XML elements with comments at the start of a text block. --- modules/juce_core/xml/juce_XmlDocument.cpp | 26 ++++++++++++++++++---- modules/juce_core/xml/juce_XmlDocument.h | 18 +++++++-------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/modules/juce_core/xml/juce_XmlDocument.cpp b/modules/juce_core/xml/juce_XmlDocument.cpp index 6243d3e0b5..3ccebd0e86 100644 --- a/modules/juce_core/xml/juce_XmlDocument.cpp +++ b/modules/juce_core/xml/juce_XmlDocument.cpp @@ -371,8 +371,8 @@ void XmlDocument::readQuotedString (String& result) } else if (character == 0) { - outOfData = true; setLastError ("unmatched quotes", false); + outOfData = true; break; } @@ -432,7 +432,7 @@ XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) ++input; if (alsoParseSubElements) - readChildElements (node); + readChildElements (*node); break; } @@ -487,9 +487,9 @@ XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) return node; } -void XmlDocument::readChildElements (XmlElement* parent) +void XmlDocument::readChildElements (XmlElement& parent) { - LinkedListPointer::Appender childAppender (parent->firstChildElement); + LinkedListPointer::Appender childAppender (parent.firstChildElement); for (;;) { @@ -563,7 +563,25 @@ void XmlDocument::readChildElements (XmlElement* parent) const juce_wchar c = *input; if (c == '<') + { + if (input[1] == '!' && input[2] == '-' && input[3] == '-') + { + input += 4; + const int closeComment = input.indexOf (CharPointer_ASCII ("-->")); + + if (closeComment < 0) + { + setLastError ("unterminated comment", false); + outOfData = true; + return; + } + + input += closeComment + 3; + continue; + } + break; + } if (c == 0) { diff --git a/modules/juce_core/xml/juce_XmlDocument.h b/modules/juce_core/xml/juce_XmlDocument.h index 582c23f39d..d2a5b49e03 100644 --- a/modules/juce_core/xml/juce_XmlDocument.h +++ b/modules/juce_core/xml/juce_XmlDocument.h @@ -156,23 +156,23 @@ private: String lastError, dtdText; StringArray tokenisedDTD; bool needToLoadDTD, ignoreEmptyTextElements; - ScopedPointer inputSource; + ScopedPointer inputSource; XmlElement* parseDocumentElement (String::CharPointerType, bool outer); - void setLastError (const String& desc, bool carryOn); + void setLastError (const String&, bool carryOn); bool parseHeader(); bool parseDTD(); void skipNextWhiteSpace(); juce_wchar readNextChar() noexcept; XmlElement* readNextElement (bool alsoParseSubElements); - void readChildElements (XmlElement* parent); - void readQuotedString (String& result); - void readEntity (String& result); + void readChildElements (XmlElement&); + void readQuotedString (String&); + void readEntity (String&); - String getFileContents (const String& filename) const; - String expandEntity (const String& entity); - String expandExternalEntity (const String& entity); - String getParameterEntity (const String& entity); + String getFileContents (const String&) const; + String expandEntity (const String&); + String expandExternalEntity (const String&); + String getParameterEntity (const String&); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument) };