parser: Protect against quadratic default attribute expansion

This commit is contained in:
Nick Wellnhofer 2023-10-06 00:31:44 +02:00
parent 7615fae62e
commit 134d2ad890
5 changed files with 98 additions and 2 deletions

View File

@ -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;

View 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/>
^

View 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/>
^

View 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

View 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>