Home » U++ Library support » U++ Core » Bugfix: XmlParser in endless loop
Bugfix: XmlParser in endless loop [message #60191] |
Mon, 02 October 2023 18:07  |
zsolt
Messages: 698 Registered: December 2005 Location: Budapest, Hungary
|
Contributor |
|
|
Try this simple code:
This function goes into an endless loop, because at the end of sReadXmlNode() function, the line
p.ReadText(); // skip empty text
doesn't do anything.
My first idea was to change it to
p.Skip();// skip empty text
It seems to be better, but the error message will not be too useful.
My proposed change:
@@ -1005,16 +1005,15 @@ static XmlNode sReadXmlNode(XmlParser& p, ParseXmlFilter *filter, dword style)
return m;
}
if(p.IsText()) {
m.CreateText(p.ReadText());
m.Shrink();
return m;
}
- p.ReadText(); // skip empty text
- return m;
+ throw XmlError("Unexpected text");
}
void ParseXmlFilter::EndTag() {}
XmlNode ParseXML(XmlParser& p, dword style, ParseXmlFilter *filter)
{
XmlNode r;
|
|
|
Re: Bugfix: XmlParser in endless loop [message #60195 is a reply to message #60191] |
Tue, 03 October 2023 00:55   |
 |
mirek
Messages: 14198 Registered: November 2005
|
Ultimate Member |
|
|
zsolt wrote on Mon, 02 October 2023 18:07Try this simple code:
This function goes into an endless loop, because at the end of sReadXmlNode() function, the line
p.ReadText(); // skip empty text
doesn't do anything.
My first idea was to change it to
p.Skip();// skip empty text
It seems to be better, but the error message will not be too useful.
My proposed change:
@@ -1005,16 +1005,15 @@ static XmlNode sReadXmlNode(XmlParser& p, ParseXmlFilter *filter, dword style)
return m;
}
if(p.IsText()) {
m.CreateText(p.ReadText());
m.Shrink();
return m;
}
- p.ReadText(); // skip empty text
- return m;
+ throw XmlError("Unexpected text");
}
void ParseXmlFilter::EndTag() {}
XmlNode ParseXML(XmlParser& p, dword style, ParseXmlFilter *filter)
{
XmlNode r;
I am not 100% sure about removing ReadText to skip empty text, I think there are cornercases that require that (I bet it is actually a fix).
But this definitely should work:
if(p.ReadText().GetCount() == 0) // skip empty text
throw XmlError("Unexpected text");
(in master now)
|
|
|
|
Re: Bugfix: XmlParser in endless loop [message #60204 is a reply to message #60196] |
Mon, 09 October 2023 10:32   |
 |
mirek
Messages: 14198 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 Feb 10 11:25:46 CET 2025
Total time taken to generate the page: 0.03220 seconds
|