diff --git a/Library/OcXmlLib/OcXmlLib.c b/Library/OcXmlLib/OcXmlLib.c old mode 100755 new mode 100644 index eb95d80962bc1f5f9c69b96340c8f46d804bdbed..b64655eefd4829e923a0b914fbe94f90ed8a5419 --- a/Library/OcXmlLib/OcXmlLib.c +++ b/Library/OcXmlLib/OcXmlLib.c @@ -651,7 +651,9 @@ XmlParseTagOpen ( CONST CHAR8 **Attributes ) { - CHAR8 Current; + CHAR8 Current; + CHAR8 Next; + BOOLEAN IsComment; XML_PARSER_INFO (Parser, "tag_open"); @@ -682,15 +684,65 @@ XmlParseTagOpen ( if (Current != '?' && Current != '!') { break; } + + // + // A crazy XML comment may look like this: + // + // + // '<' has already been consumed a bit earlier, now continue to check '!', + // and then the two '-'. + // + IsComment = FALSE; + if (Current == '!') { + // + // Consume one more byte to check the two '-'. + // Now "" for comments and break if matched. + // + if (XmlParserPeek (Parser, CURRENT_CHARACTER) == '-' + && XmlParserPeek (Parser, NEXT_CHARACTER) == '-' + && XmlParserPeek (Parser, 2) == '>') { + // + // "-->" should all be consumed, which takes 3 bytes. + // + XmlParserConsume (Parser, 3); + break; + } + } else { + // + // For non-comments, simply match '>'. + // + if (XmlParserPeek (Parser, CURRENT_CHARACTER) == '>') { + XmlParserConsume (Parser, 1); + break; + } + } + // + // Consume each byte normally. + // + XmlParserConsume (Parser, 1); + } } while (Parser->Position < Parser->Length); //