1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 20:25:14 +03:00

Fix timeout when handling recursive entities

Abort parsing early to avoid an almost infinite loop in certain error
cases involving recursive entities.

Found with libFuzzer.
This commit is contained in:
Nick Wellnhofer 2020-12-18 12:50:21 +01:00
parent 45da175c14
commit 79301d3d5e
2 changed files with 86 additions and 205 deletions

View File

@ -7158,6 +7158,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
ent->checked |= 1;
if (ret == XML_ERR_ENTITY_LOOP) {
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
xmlHaltParser(ctxt);
xmlFreeNodeList(list);
return;
}

View File

@ -1,243 +1,123 @@
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Entity 'e' failed to parse
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:2: parser error : chunk is not well balanced
^
./test/errors/rec_ext_ent.xml:4: parser error : Entity 'e' failed to parse
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
test/errors/rec_ext.ent:1: parser error : Detected an entity reference loop
<ent>&e; &e; &e; &e;</ent>
^
./test/errors/rec_ext_ent.xml:4: parser error : Detected an entity reference loop
<doc>&e; &e; &e; &e;</doc>
^