Home » U++ Library support » U++ Core » Bugfix: XmlParser in endless loop
Re: Bugfix: XmlParser in endless loop [message #60204 is a reply to message #60196] |
Mon, 09 October 2023 10:32   |
 |
mirek
Messages: 14257 Registered: November 2005
|
Ultimate Member |
|
|
So that fix proved wrong, breaking autotests, so I have reverted and provided proper fix by moving the check / throw one level up:
static XmlNode sReadXmlNode(XmlParser& p, ParseXmlFilter *filter, dword style)
{
XmlNode m;
if(p.IsTag()) {
String tag = p.ReadTag();
if(!filter || filter->DoTag(tag)) {
m.CreateTag(tag);
m.SetAttrs(p.PickAttrs());
while(!p.End())
if(!Ignore(p, style)) {
XmlNode n = sReadXmlNode(p, filter, style);
if(n.GetType() != XML_DOC) // tag was ignored
m.Add() = pick(n);
}
if(filter)
filter->EndTag();
}
else
p.SkipEnd();
return m;
}
if(p.IsPI()) {
m.CreatePI(p.ReadPI());
return m;
}
if(p.IsDecl()) {
m.CreateDecl(p.ReadDecl());
return m;
}
if(p.IsComment()) {
m.CreateComment(p.ReadComment());
return m;
}
if(p.IsText()) {
m.CreateText(p.ReadText());
m.Shrink();
return m;
}
p.ReadText(); // skip empty text
return m;
}
void ParseXmlFilter::EndTag() {}
XmlNode ParseXML(XmlParser& p, dword style, ParseXmlFilter *filter)
{
XmlNode r;
while(!p.IsEof())
if(!Ignore(p, style)) {
XmlNode n = sReadXmlNode(p, filter, style);
if(n.GetType() != XML_DOC) // tag was ignored
r.Add() = pick(n);
else {
if(p.IsRelaxed())
p.Skip();
else
throw XmlError("Unexpected text");
}
}
return r;
}
|
|
|
Goto Forum:
Current Time: Mon May 12 16:08:35 CEST 2025
Total time taken to generate the page: 0.00795 seconds
|