mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-04-01 10:50:08 +03:00
parser: Protect against quadratic default attribute expansion
This commit is contained in:
parent
7615fae62e
commit
134d2ad890
17
parser.c
17
parser.c
@ -885,6 +885,7 @@ typedef struct {
|
||||
xmlHashedString value;
|
||||
const xmlChar *valueEnd;
|
||||
int external;
|
||||
int expandedSize;
|
||||
} xmlDefAttr;
|
||||
|
||||
typedef struct _xmlDefAttrs xmlDefAttrs;
|
||||
@ -1014,7 +1015,7 @@ xmlAddDefAttrs(xmlParserCtxtPtr ctxt,
|
||||
const xmlChar *value) {
|
||||
xmlDefAttrsPtr defaults;
|
||||
xmlDefAttr *attr;
|
||||
int len;
|
||||
int len, expandedSize;
|
||||
xmlHashedString name;
|
||||
xmlHashedString prefix;
|
||||
xmlHashedString hvalue;
|
||||
@ -1094,17 +1095,23 @@ xmlAddDefAttrs(xmlParserCtxtPtr ctxt,
|
||||
goto mem_error;
|
||||
|
||||
/* intern the string and precompute the end */
|
||||
len = xmlStrlen(value);
|
||||
len = strlen((const char *) value);
|
||||
hvalue = xmlDictLookupHashed(ctxt->dict, value, len);
|
||||
if (hvalue.name == NULL)
|
||||
goto mem_error;
|
||||
|
||||
expandedSize = strlen((const char *) name.name);
|
||||
if (prefix.name != NULL)
|
||||
expandedSize += strlen((const char *) prefix.name);
|
||||
expandedSize += len;
|
||||
|
||||
attr = &defaults->attrs[defaults->nbAttrs++];
|
||||
attr->name = name;
|
||||
attr->prefix = prefix;
|
||||
attr->value = hvalue;
|
||||
attr->valueEnd = hvalue.name + len;
|
||||
attr->external = ctxt->external;
|
||||
attr->expandedSize = expandedSize;
|
||||
|
||||
return;
|
||||
|
||||
@ -9801,9 +9808,13 @@ next_attr:
|
||||
aprefix = attr->prefix.name;
|
||||
|
||||
if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) {
|
||||
xmlParserEntityCheck(ctxt, attr->expandedSize);
|
||||
|
||||
if (xmlParserNsPush(ctxt, NULL, &attr->value, NULL, 1) > 0)
|
||||
nbNs++;
|
||||
} else if (aprefix == ctxt->str_xmlns) {
|
||||
xmlParserEntityCheck(ctxt, attr->expandedSize);
|
||||
|
||||
if (xmlParserNsPush(ctxt, &attr->name, &attr->value,
|
||||
NULL, 1) > 0)
|
||||
nbNs++;
|
||||
@ -9951,6 +9962,8 @@ next_attr:
|
||||
attname, nsuri, NULL);
|
||||
}
|
||||
|
||||
xmlParserEntityCheck(ctxt, attr->expandedSize);
|
||||
|
||||
if ((atts == NULL) || (nbatts + 5 > maxatts)) {
|
||||
if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) {
|
||||
localname = NULL;
|
||||
|
3
result/errors/quadratic-defattr.xml.ent
Normal file
3
result/errors/quadratic-defattr.xml.ent
Normal file
@ -0,0 +1,3 @@
|
||||
./test/errors/quadratic-defattr.xml:65: parser error : Maximum entity amplification factor exceeded, see xmlCtxtSetMaxAmplification.
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
^
|
3
result/errors/quadratic-defattr.xml.err
Normal file
3
result/errors/quadratic-defattr.xml.err
Normal file
@ -0,0 +1,3 @@
|
||||
./test/errors/quadratic-defattr.xml:65: parser error : Maximum entity amplification factor exceeded, see xmlCtxtSetMaxAmplification.
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
^
|
4
result/errors/quadratic-defattr.xml.str
Normal file
4
result/errors/quadratic-defattr.xml.str
Normal file
@ -0,0 +1,4 @@
|
||||
./test/errors/quadratic-defattr.xml:65: parser error : Maximum entity amplification factor exceeded, see xmlCtxtSetMaxAmplification.
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
^
|
||||
./test/errors/quadratic-defattr.xml : failed to parse
|
73
test/errors/quadratic-defattr.xml
Normal file
73
test/errors/quadratic-defattr.xml
Normal file
@ -0,0 +1,73 @@
|
||||
<!DOCTYPE doc [
|
||||
<!ELEMENT doc (e*)>
|
||||
<!ELEMENT e EMPTY>
|
||||
<!ATTLIST e
|
||||
a000 (0) '0' a001 (0) '0' a002 (0) '0' a003 (0) '0' a004 (0) '0' a005 (0) '0'
|
||||
a006 (0) '0' a007 (0) '0' a008 (0) '0' a009 (0) '0' a010 (0) '0' a011 (0) '0'
|
||||
a012 (0) '0' a013 (0) '0' a014 (0) '0' a015 (0) '0' a016 (0) '0' a017 (0) '0'
|
||||
a018 (0) '0' a019 (0) '0' a020 (0) '0' a021 (0) '0' a022 (0) '0' a023 (0) '0'
|
||||
a024 (0) '0' a025 (0) '0' a026 (0) '0' a027 (0) '0' a028 (0) '0' a029 (0) '0'
|
||||
a030 (0) '0' a031 (0) '0' a032 (0) '0' a033 (0) '0' a034 (0) '0' a035 (0) '0'
|
||||
a036 (0) '0' a037 (0) '0' a038 (0) '0' a039 (0) '0' a040 (0) '0' a041 (0) '0'
|
||||
a042 (0) '0' a043 (0) '0' a044 (0) '0' a045 (0) '0' a046 (0) '0' a047 (0) '0'
|
||||
a048 (0) '0' a049 (0) '0' a050 (0) '0' a051 (0) '0' a052 (0) '0' a053 (0) '0'
|
||||
a054 (0) '0' a055 (0) '0' a056 (0) '0' a057 (0) '0' a058 (0) '0' a059 (0) '0'
|
||||
a060 (0) '0' a061 (0) '0' a062 (0) '0' a063 (0) '0' a064 (0) '0' a065 (0) '0'
|
||||
a066 (0) '0' a067 (0) '0' a068 (0) '0' a069 (0) '0' a070 (0) '0' a071 (0) '0'
|
||||
a072 (0) '0' a073 (0) '0' a074 (0) '0' a075 (0) '0' a076 (0) '0' a077 (0) '0'
|
||||
a078 (0) '0' a079 (0) '0' a080 (0) '0' a081 (0) '0' a082 (0) '0' a083 (0) '0'
|
||||
a084 (0) '0' a085 (0) '0' a086 (0) '0' a087 (0) '0' a088 (0) '0' a089 (0) '0'
|
||||
a090 (0) '0' a091 (0) '0' a092 (0) '0' a093 (0) '0' a094 (0) '0' a095 (0) '0'
|
||||
a096 (0) '0' a097 (0) '0' a098 (0) '0' a099 (0) '0' a100 (0) '0' a101 (0) '0'
|
||||
a102 (0) '0' a103 (0) '0' a104 (0) '0' a105 (0) '0' a106 (0) '0' a107 (0) '0'
|
||||
a108 (0) '0' a109 (0) '0' a110 (0) '0' a111 (0) '0' a112 (0) '0' a113 (0) '0'
|
||||
a114 (0) '0' a115 (0) '0' a116 (0) '0' a117 (0) '0' a118 (0) '0' a119 (0) '0'
|
||||
a120 (0) '0' a121 (0) '0' a122 (0) '0' a123 (0) '0' a124 (0) '0' a125 (0) '0'
|
||||
a126 (0) '0' a127 (0) '0' a128 (0) '0' a129 (0) '0' a130 (0) '0' a131 (0) '0'
|
||||
a132 (0) '0' a133 (0) '0' a134 (0) '0' a135 (0) '0' a136 (0) '0' a137 (0) '0'
|
||||
a138 (0) '0' a139 (0) '0' a140 (0) '0' a141 (0) '0' a142 (0) '0' a143 (0) '0'
|
||||
a144 (0) '0' a145 (0) '0' a146 (0) '0' a147 (0) '0' a148 (0) '0' a149 (0) '0'
|
||||
a150 (0) '0' a151 (0) '0' a152 (0) '0' a153 (0) '0' a154 (0) '0' a155 (0) '0'
|
||||
a156 (0) '0' a157 (0) '0' a158 (0) '0' a159 (0) '0' a160 (0) '0' a161 (0) '0'
|
||||
a162 (0) '0' a163 (0) '0' a164 (0) '0' a165 (0) '0' a166 (0) '0' a167 (0) '0'
|
||||
a168 (0) '0' a169 (0) '0' a170 (0) '0' a171 (0) '0' a172 (0) '0' a173 (0) '0'
|
||||
a174 (0) '0' a175 (0) '0' a176 (0) '0' a177 (0) '0' a178 (0) '0' a179 (0) '0'
|
||||
a180 (0) '0' a181 (0) '0' a182 (0) '0' a183 (0) '0' a184 (0) '0' a185 (0) '0'
|
||||
a186 (0) '0' a187 (0) '0' a188 (0) '0' a189 (0) '0' a190 (0) '0' a191 (0) '0'
|
||||
a192 (0) '0' a193 (0) '0' a194 (0) '0' a195 (0) '0' a196 (0) '0' a197 (0) '0'
|
||||
a198 (0) '0' a199 (0) '0' a200 (0) '0' a201 (0) '0' a202 (0) '0' a203 (0) '0'
|
||||
a204 (0) '0' a205 (0) '0' a206 (0) '0' a207 (0) '0' a208 (0) '0' a209 (0) '0'
|
||||
a210 (0) '0' a211 (0) '0' a212 (0) '0' a213 (0) '0' a214 (0) '0' a215 (0) '0'
|
||||
a216 (0) '0' a217 (0) '0' a218 (0) '0' a219 (0) '0' a220 (0) '0' a221 (0) '0'
|
||||
a222 (0) '0' a223 (0) '0' a224 (0) '0' a225 (0) '0' a226 (0) '0' a227 (0) '0'
|
||||
a228 (0) '0' a229 (0) '0' a230 (0) '0' a231 (0) '0' a232 (0) '0' a233 (0) '0'
|
||||
a234 (0) '0' a235 (0) '0' a236 (0) '0' a237 (0) '0' a238 (0) '0' a239 (0) '0'
|
||||
a240 (0) '0' a241 (0) '0' a242 (0) '0' a243 (0) '0' a244 (0) '0' a245 (0) '0'
|
||||
a246 (0) '0' a247 (0) '0' a248 (0) '0' a249 (0) '0' a250 (0) '0' a251 (0) '0'
|
||||
a252 (0) '0' a253 (0) '0' a254 (0) '0' a255 (0) '0' a256 (0) '0' a257 (0) '0'
|
||||
a258 (0) '0' a259 (0) '0' a260 (0) '0' a261 (0) '0' a262 (0) '0' a263 (0) '0'
|
||||
a264 (0) '0' a265 (0) '0' a266 (0) '0' a267 (0) '0' a268 (0) '0' a269 (0) '0'
|
||||
a270 (0) '0' a271 (0) '0' a272 (0) '0' a273 (0) '0' a274 (0) '0' a275 (0) '0'
|
||||
a276 (0) '0' a277 (0) '0' a278 (0) '0' a279 (0) '0' a280 (0) '0' a281 (0) '0'
|
||||
a282 (0) '0' a283 (0) '0' a284 (0) '0' a285 (0) '0' a286 (0) '0' a287 (0) '0'
|
||||
a288 (0) '0' a289 (0) '0' a290 (0) '0' a291 (0) '0' a292 (0) '0' a293 (0) '0'
|
||||
a294 (0) '0' a295 (0) '0' a296 (0) '0' a297 (0) '0' a298 (0) '0' a299 (0) '0'
|
||||
>
|
||||
]>
|
||||
<doc>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
<e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/><e/>
|
||||
</doc>
|
Loading…
x
Reference in New Issue
Block a user