|
Line
Link Here
|
| 0 |
-- libxml2-2.6.32.dfsg.orig/entities.c |
0 |
++ libxml2-2.6.32.dfsg/entities.c |
|
Lines 102-108
Link Here
|
| 102 |
dict = entity->doc->dict; |
102 |
dict = entity->doc->dict; |
| 103 |
|
103 |
|
| 104 |
|
104 |
|
| 105 |
if ((entity->children) && (entity->owner == 1) && |
105 |
if ((entity->children) && (entity->owner != 0) && |
| 106 |
(entity == (xmlEntityPtr) entity->children->parent)) |
106 |
(entity == (xmlEntityPtr) entity->children->parent)) |
| 107 |
xmlFreeNodeList(entity->children); |
107 |
xmlFreeNodeList(entity->children); |
| 108 |
if (dict != NULL) { |
108 |
if (dict != NULL) { |
| 109 |
-- libxml2-2.6.32.dfsg.orig/parser.c |
109 |
++ libxml2-2.6.32.dfsg/parser.c |
|
Lines 2344-2350
Link Here
|
| 2344 |
return(NULL); |
2344 |
return(NULL); |
| 2345 |
last = str + len; |
2345 |
last = str + len; |
| 2346 |
|
2346 |
|
| 2347 |
if (ctxt->depth > 40) { |
2347 |
if ((ctxt->depth > 40) || (ctxt->nbentities >= 500000)) { |
| 2348 |
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
2348 |
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
| 2349 |
return(NULL); |
2349 |
return(NULL); |
| 2350 |
} |
2350 |
} |
|
Lines 2382-2387
Link Here
|
| 2382 |
"String decoding Entity Reference: %.30s\n", |
2382 |
"String decoding Entity Reference: %.30s\n", |
| 2383 |
str); |
2383 |
str); |
| 2384 |
ent = xmlParseStringEntityRef(ctxt, &str); |
2384 |
ent = xmlParseStringEntityRef(ctxt, &str); |
|
|
2385 |
if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
| 2386 |
goto int_error; |
| 2387 |
ctxt->nbentities++; |
| 2388 |
if (ent != NULL) |
| 2389 |
ctxt->nbentities += ent->owner; |
| 2385 |
if ((ent != NULL) && |
2390 |
if ((ent != NULL) && |
| 2386 |
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
2391 |
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
| 2387 |
if (ent->content != NULL) { |
2392 |
if (ent->content != NULL) { |
|
Lines 2427-2432
Link Here
|
| 2427 |
xmlGenericError(xmlGenericErrorContext, |
2432 |
xmlGenericError(xmlGenericErrorContext, |
| 2428 |
"String decoding PE Reference: %.30s\n", str); |
2433 |
"String decoding PE Reference: %.30s\n", str); |
| 2429 |
ent = xmlParseStringPEReference(ctxt, &str); |
2434 |
ent = xmlParseStringPEReference(ctxt, &str); |
|
|
2435 |
if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
| 2436 |
goto int_error; |
| 2437 |
ctxt->nbentities++; |
| 2438 |
if (ent != NULL) |
| 2439 |
ctxt->nbentities += ent->owner; |
| 2430 |
if (ent != NULL) { |
2440 |
if (ent != NULL) { |
| 2431 |
if (ent->content == NULL) { |
2441 |
if (ent->content == NULL) { |
| 2432 |
if (xmlLoadEntityContent(ctxt, ent) < 0) { |
2442 |
if (xmlLoadEntityContent(ctxt, ent) < 0) { |
|
Lines 2468-2473
Link Here
|
| 2468 |
xmlErrMemory(ctxt, NULL); |
2478 |
xmlErrMemory(ctxt, NULL); |
| 2469 |
if (rep != NULL) |
2479 |
if (rep != NULL) |
| 2470 |
xmlFree(rep); |
2480 |
xmlFree(rep); |
|
|
2481 |
int_error: |
| 2471 |
if (buffer != NULL) |
2482 |
if (buffer != NULL) |
| 2472 |
xmlFree(buffer); |
2483 |
xmlFree(buffer); |
| 2473 |
return(NULL); |
2484 |
return(NULL); |
|
Lines 3280-3285
Link Here
|
| 3280 |
} |
3291 |
} |
| 3281 |
} else { |
3292 |
} else { |
| 3282 |
ent = xmlParseEntityRef(ctxt); |
3293 |
ent = xmlParseEntityRef(ctxt); |
|
|
3294 |
ctxt->nbentities++; |
| 3295 |
if (ent != NULL) |
| 3296 |
ctxt->nbentities += ent->owner; |
| 3283 |
if ((ent != NULL) && |
3297 |
if ((ent != NULL) && |
| 3284 |
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
3298 |
(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
| 3285 |
if (len > buf_size - 10) { |
3299 |
if (len > buf_size - 10) { |
|
Lines 4566-4571
Link Here
|
| 4566 |
int isParameter = 0; |
4580 |
int isParameter = 0; |
| 4567 |
xmlChar *orig = NULL; |
4581 |
xmlChar *orig = NULL; |
| 4568 |
int skipped; |
4582 |
int skipped; |
|
|
4583 |
unsigned long oldnbent = ctxt->nbentities; |
| 4569 |
|
4584 |
|
| 4570 |
/* GROW; done in the caller */ |
4585 |
/* GROW; done in the caller */ |
| 4571 |
if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { |
4586 |
if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { |
|
Lines 4783-4788
Link Here
|
| 4783 |
} |
4798 |
} |
| 4784 |
} |
4799 |
} |
| 4785 |
if (cur != NULL) { |
4800 |
if (cur != NULL) { |
|
|
4801 |
if ((cur->owner != 0) || (cur->children == NULL)) { |
| 4802 |
cur->owner = ctxt->nbentities - oldnbent; |
| 4803 |
if (cur->owner == 0) |
| 4804 |
cur->owner = 1; |
| 4805 |
} |
| 4786 |
if (cur->orig != NULL) |
4806 |
if (cur->orig != NULL) |
| 4787 |
xmlFree(orig); |
4807 |
xmlFree(orig); |
| 4788 |
else |
4808 |
else |
|
Lines 6189-6194
Link Here
|
| 6189 |
if (ent == NULL) return; |
6209 |
if (ent == NULL) return; |
| 6190 |
if (!ctxt->wellFormed) |
6210 |
if (!ctxt->wellFormed) |
| 6191 |
return; |
6211 |
return; |
|
|
6212 |
ctxt->nbentities++; |
| 6213 |
if (ctxt->nbentities >= 500000) { |
| 6214 |
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
| 6215 |
return; |
| 6216 |
} |
| 6192 |
was_checked = ent->checked; |
6217 |
was_checked = ent->checked; |
| 6193 |
if ((ent->name != NULL) && |
6218 |
if ((ent->name != NULL) && |
| 6194 |
(ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { |
6219 |
(ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { |
|
Lines 6240-6246
Link Here
|
| 6240 |
(ent->children == NULL)) { |
6265 |
(ent->children == NULL)) { |
| 6241 |
ent->children = list; |
6266 |
ent->children = list; |
| 6242 |
ent->last = list; |
6267 |
ent->last = list; |
| 6243 |
ent->owner = 1; |
6268 |
if (ent->owner == 0) |
|
|
6269 |
ent->owner = 1; |
| 6244 |
list->parent = (xmlNodePtr) ent; |
6270 |
list->parent = (xmlNodePtr) ent; |
| 6245 |
} else { |
6271 |
} else { |
| 6246 |
xmlFreeNodeList(list); |
6272 |
xmlFreeNodeList(list); |
|
Lines 6249-6254
Link Here
|
| 6249 |
xmlFreeNodeList(list); |
6275 |
xmlFreeNodeList(list); |
| 6250 |
} |
6276 |
} |
| 6251 |
} else { |
6277 |
} else { |
|
|
6278 |
unsigned long oldnbent = ctxt->nbentities; |
| 6252 |
/* |
6279 |
/* |
| 6253 |
* 4.3.2: An internal general parsed entity is well-formed |
6280 |
* 4.3.2: An internal general parsed entity is well-formed |
| 6254 |
* if its replacement text matches the production labeled |
6281 |
* if its replacement text matches the production labeled |
|
Lines 6271-6276
Link Here
|
| 6271 |
ret = xmlParseBalancedChunkMemoryInternal(ctxt, |
6298 |
ret = xmlParseBalancedChunkMemoryInternal(ctxt, |
| 6272 |
value, user_data, &list); |
6299 |
value, user_data, &list); |
| 6273 |
ctxt->depth--; |
6300 |
ctxt->depth--; |
|
|
6301 |
|
| 6274 |
} else if (ent->etype == |
6302 |
} else if (ent->etype == |
| 6275 |
XML_EXTERNAL_GENERAL_PARSED_ENTITY) { |
6303 |
XML_EXTERNAL_GENERAL_PARSED_ENTITY) { |
| 6276 |
ctxt->depth++; |
6304 |
ctxt->depth++; |
|
Lines 6283-6288
Link Here
|
| 6283 |
xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, |
6311 |
xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, |
| 6284 |
"invalid entity type found\n", NULL); |
6312 |
"invalid entity type found\n", NULL); |
| 6285 |
} |
6313 |
} |
|
|
6314 |
if ((ent->owner != 0) || (ent->children == NULL)) { |
| 6315 |
ent->owner = ctxt->nbentities - oldnbent; |
| 6316 |
if (ent->owner == 0) |
| 6317 |
ent->owner = 1; |
| 6318 |
} |
| 6286 |
if (ret == XML_ERR_ENTITY_LOOP) { |
6319 |
if (ret == XML_ERR_ENTITY_LOOP) { |
| 6287 |
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
6320 |
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
| 6288 |
return; |
6321 |
return; |
|
Lines 6301-6307
Link Here
|
| 6301 |
(ctxt->parseMode == XML_PARSE_READER)) { |
6334 |
(ctxt->parseMode == XML_PARSE_READER)) { |
| 6302 |
list->parent = (xmlNodePtr) ent; |
6335 |
list->parent = (xmlNodePtr) ent; |
| 6303 |
list = NULL; |
6336 |
list = NULL; |
| 6304 |
ent->owner = 1; |
6337 |
if (ent->owner == 0) |
|
|
6338 |
ent->owner = 1; |
| 6305 |
} else { |
6339 |
} else { |
| 6306 |
ent->owner = 0; |
6340 |
ent->owner = 0; |
| 6307 |
while (list != NULL) { |
6341 |
while (list != NULL) { |
|
Lines 6318-6324
Link Here
|
| 6318 |
#endif /* LIBXML_LEGACY_ENABLED */ |
6352 |
#endif /* LIBXML_LEGACY_ENABLED */ |
| 6319 |
} |
6353 |
} |
| 6320 |
} else { |
6354 |
} else { |
| 6321 |
ent->owner = 1; |
6355 |
if (ent->owner == 0) |
|
|
6356 |
ent->owner = 1; |
| 6322 |
while (list != NULL) { |
6357 |
while (list != NULL) { |
| 6323 |
list->parent = (xmlNodePtr) ent; |
6358 |
list->parent = (xmlNodePtr) ent; |
| 6324 |
if (list->next == NULL) |
6359 |
if (list->next == NULL) |
|
Lines 6393-6398
Link Here
|
| 6393 |
} |
6428 |
} |
| 6394 |
return; |
6429 |
return; |
| 6395 |
} |
6430 |
} |
|
|
6431 |
ctxt->nbentities += ent->owner; |
| 6396 |
if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && |
6432 |
if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && |
| 6397 |
(ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) { |
6433 |
(ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) { |
| 6398 |
/* |
6434 |
/* |
|
Lines 6495-6501
Link Here
|
| 6495 |
break; |
6531 |
break; |
| 6496 |
cur = next; |
6532 |
cur = next; |
| 6497 |
} |
6533 |
} |
| 6498 |
ent->owner = 1; |
6534 |
if (ent->owner == 0) |
|
|
6535 |
ent->owner = 1; |
| 6499 |
#ifdef LIBXML_LEGACY_ENABLED |
6536 |
#ifdef LIBXML_LEGACY_ENABLED |
| 6500 |
if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) |
6537 |
if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) |
| 6501 |
xmlAddEntityReference(ent, firstChild, nw); |
6538 |
xmlAddEntityReference(ent, firstChild, nw); |
|
Lines 11480-11486
Link Here
|
| 11480 |
|
11517 |
|
| 11481 |
if (ctx == NULL) return(-1); |
11518 |
if (ctx == NULL) return(-1); |
| 11482 |
|
11519 |
|
| 11483 |
if (ctx->depth > 40) { |
11520 |
if ((ctx->depth > 40) || (ctx->nbentities >= 500000)) { |
| 11484 |
return(XML_ERR_ENTITY_LOOP); |
11521 |
return(XML_ERR_ENTITY_LOOP); |
| 11485 |
} |
11522 |
} |
| 11486 |
|
11523 |
|
|
Lines 11681-11687
Link Here
|
| 11681 |
xmlChar start[4]; |
11718 |
xmlChar start[4]; |
| 11682 |
xmlCharEncoding enc; |
11719 |
xmlCharEncoding enc; |
| 11683 |
|
11720 |
|
| 11684 |
if (depth > 40) { |
11721 |
if ((depth > 40) || |
|
|
11722 |
((oldctxt != NULL) && (oldctxt->nbentities >= 500000))) { |
| 11685 |
return(XML_ERR_ENTITY_LOOP); |
11723 |
return(XML_ERR_ENTITY_LOOP); |
| 11686 |
} |
11724 |
} |
| 11687 |
|
11725 |
|
|
Lines 11824-11829
Link Here
|
| 11824 |
oldctxt->node_seq.maximum = ctxt->node_seq.maximum; |
11862 |
oldctxt->node_seq.maximum = ctxt->node_seq.maximum; |
| 11825 |
oldctxt->node_seq.length = ctxt->node_seq.length; |
11863 |
oldctxt->node_seq.length = ctxt->node_seq.length; |
| 11826 |
oldctxt->node_seq.buffer = ctxt->node_seq.buffer; |
11864 |
oldctxt->node_seq.buffer = ctxt->node_seq.buffer; |
|
|
11865 |
oldctxt->nbentities += ctxt->nbentities; |
| 11827 |
ctxt->node_seq.maximum = 0; |
11866 |
ctxt->node_seq.maximum = 0; |
| 11828 |
ctxt->node_seq.length = 0; |
11867 |
ctxt->node_seq.length = 0; |
| 11829 |
ctxt->node_seq.buffer = NULL; |
11868 |
ctxt->node_seq.buffer = NULL; |
|
Lines 11924-11930
Link Here
|
| 11924 |
int size; |
11963 |
int size; |
| 11925 |
xmlParserErrors ret = XML_ERR_OK; |
11964 |
xmlParserErrors ret = XML_ERR_OK; |
| 11926 |
|
11965 |
|
| 11927 |
if (oldctxt->depth > 40) { |
11966 |
if ((oldctxt->depth > 40) || (oldctxt->nbentities >= 500000)) { |
| 11928 |
return(XML_ERR_ENTITY_LOOP); |
11967 |
return(XML_ERR_ENTITY_LOOP); |
| 11929 |
} |
11968 |
} |
| 11930 |
|
11969 |
|
|
Lines 12048-12053
Link Here
|
| 12048 |
ctxt->myDoc->last = last; |
12087 |
ctxt->myDoc->last = last; |
| 12049 |
} |
12088 |
} |
| 12050 |
|
12089 |
|
|
|
12090 |
oldctxt->nbentities += ctxt->nbentities; |
| 12051 |
ctxt->sax = oldsax; |
12091 |
ctxt->sax = oldsax; |
| 12052 |
ctxt->dict = NULL; |
12092 |
ctxt->dict = NULL; |
| 12053 |
ctxt->attsDefault = NULL; |
12093 |
ctxt->attsDefault = NULL; |
|
Lines 13363-13368
Link Here
|
| 13363 |
ctxt->depth = 0; |
13403 |
ctxt->depth = 0; |
| 13364 |
ctxt->charset = XML_CHAR_ENCODING_UTF8; |
13404 |
ctxt->charset = XML_CHAR_ENCODING_UTF8; |
| 13365 |
ctxt->catalogs = NULL; |
13405 |
ctxt->catalogs = NULL; |
|
|
13406 |
ctxt->nbentities = 0; |
| 13366 |
xmlInitNodeInfoSeq(&ctxt->node_seq); |
13407 |
xmlInitNodeInfoSeq(&ctxt->node_seq); |
| 13367 |
|
13408 |
|
| 13368 |
if (ctxt->attsDefault != NULL) { |
13409 |
if (ctxt->attsDefault != NULL) { |
| 13369 |
-- libxml2-2.6.32.dfsg.orig/include/libxml/parser.h |
13410 |
++ libxml2-2.6.32.dfsg/include/libxml/parser.h |
|
Lines 297-302
Link Here
|
| 297 |
*/ |
297 |
*/ |
| 298 |
xmlError lastError; |
298 |
xmlError lastError; |
| 299 |
xmlParserMode parseMode; /* the parser mode */ |
299 |
xmlParserMode parseMode; /* the parser mode */ |
|
|
300 |
unsigned long nbentities; /* number of entities references */ |
| 300 |
}; |
301 |
}; |
| 301 |
|
302 |
|
| 302 |
/** |
303 |
/** |
| 303 |
-- libxml2-2.6.32.dfsg.orig/parserInternals.c |
304 |
++ libxml2-2.6.32.dfsg/parserInternals.c |
|
Lines 1669-1674
Link Here
|
| 1669 |
ctxt->depth = 0; |
1669 |
ctxt->depth = 0; |
| 1670 |
ctxt->charset = XML_CHAR_ENCODING_UTF8; |
1670 |
ctxt->charset = XML_CHAR_ENCODING_UTF8; |
| 1671 |
ctxt->catalogs = NULL; |
1671 |
ctxt->catalogs = NULL; |
|
|
1672 |
ctxt->nbentities = 0; |
| 1672 |
xmlInitNodeInfoSeq(&ctxt->node_seq); |
1673 |
xmlInitNodeInfoSeq(&ctxt->node_seq); |
| 1673 |
return(0); |
1674 |
return(0); |
| 1674 |
} |
1675 |
} |