aboutsummaryrefslogtreecommitdiff
path: root/textproc/libxml2/files/patch-CVE-2008-3281
diff options
context:
space:
mode:
Diffstat (limited to 'textproc/libxml2/files/patch-CVE-2008-3281')
-rw-r--r--textproc/libxml2/files/patch-CVE-2008-3281412
1 files changed, 0 insertions, 412 deletions
diff --git a/textproc/libxml2/files/patch-CVE-2008-3281 b/textproc/libxml2/files/patch-CVE-2008-3281
deleted file mode 100644
index b8fa9047e4bb..000000000000
--- a/textproc/libxml2/files/patch-CVE-2008-3281
+++ /dev/null
@@ -1,412 +0,0 @@
-diff -pruN libxml2-2.6.31.cve-2008-3281/entities.c libxml2-2.6.31/entities.c
---- libxml2-2.6.31.cve-2008-3281/entities.c 2007-01-03 08:07:52.000000000 -0500
-+++ entities.c 2008-09-11 16:08:42.000000000 -0400
-@@ -102,7 +102,7 @@ xmlFreeEntity(xmlEntityPtr entity)
- dict = entity->doc->dict;
-
-
-- if ((entity->children) && (entity->owner == 1) &&
-+ if ((entity->children) && (entity->owner != 0) &&
- (entity == (xmlEntityPtr) entity->children->parent))
- xmlFreeNodeList(entity->children);
- if (dict != NULL) {
-diff -pruN libxml2-2.6.31.cve-2008-3281/include/libxml/parser.h libxml2-2.6.31/include/libxml/parser.h
---- libxml2-2.6.31.cve-2008-3281/include/libxml/parser.h 2007-01-03 08:07:30.000000000 -0500
-+++ include/libxml/parser.h 2008-09-11 16:08:42.000000000 -0400
-@@ -297,6 +297,8 @@ struct _xmlParserCtxt {
- */
- xmlError lastError;
- xmlParserMode parseMode; /* the parser mode */
-+ unsigned long nbentities; /* number of entities references */
-+ unsigned long sizeentities; /* size of parsed entities */
- };
-
- /**
-diff -pruN libxml2-2.6.31.cve-2008-3281/parser.c libxml2-2.6.31/parser.c
---- libxml2-2.6.31.cve-2008-3281/parser.c 2008-01-11 01:36:20.000000000 -0500
-+++ parser.c 2008-09-11 16:10:45.000000000 -0400
-@@ -80,6 +80,95 @@
- #include <zlib.h>
- #endif
-
-+static void
-+xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info);
-+
-+/************************************************************************
-+ * *
-+ * Arbitrary limits set in the parser. *
-+ * *
-+ ************************************************************************/
-+
-+#define XML_PARSER_BIG_ENTITY 1000
-+#define XML_PARSER_LOT_ENTITY 5000
-+
-+/*
-+ * XML_PARSER_NON_LINEAR is the threshold where the ratio of parsed entity
-+ * replacement over the size in byte of the input indicates that you have
-+ * and eponential behaviour. A value of 10 correspond to at least 3 entity
-+ * replacement per byte of input.
-+ */
-+#define XML_PARSER_NON_LINEAR 10
-+
-+/*
-+ * xmlParserEntityCheck
-+ *
-+ * Function to check non-linear entity expansion behaviour
-+ * This is here to detect and stop exponential linear entity expansion
-+ * This is not a limitation of the parser but a safety
-+ * boundary feature.
-+ */
-+static int
-+xmlParserEntityCheck(xmlParserCtxtPtr ctxt, unsigned long size,
-+ xmlEntityPtr ent)
-+{
-+ unsigned long consumed = 0;
-+
-+ if (ctxt == NULL)
-+ return (0);
-+ if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP)
-+ return (1);
-+ if (size != 0) {
-+ /*
-+ * Do the check based on the replacement size of the entity
-+ */
-+ if (size < XML_PARSER_BIG_ENTITY)
-+ return(0);
-+
-+ /*
-+ * A limit on the amount of text data reasonably used
-+ */
-+ if (ctxt->input != NULL) {
-+ consumed = ctxt->input->consumed +
-+ (ctxt->input->cur - ctxt->input->base);
-+ }
-+ consumed += ctxt->sizeentities;
-+
-+ if ((size < XML_PARSER_NON_LINEAR * consumed) &&
-+ (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed))
-+ return (0);
-+ } else if (ent != NULL) {
-+ /*
-+ * use the number of parsed entities in the replacement
-+ */
-+ size = ent->owner;
-+
-+ /*
-+ * The amount of data parsed counting entities size only once
-+ */
-+ if (ctxt->input != NULL) {
-+ consumed = ctxt->input->consumed +
-+ (ctxt->input->cur - ctxt->input->base);
-+ }
-+ consumed += ctxt->sizeentities;
-+
-+ /*
-+ * Check the density of entities for the amount of data
-+ * knowing an entity reference will take at least 3 bytes
-+ */
-+ if (size * 3 < consumed * XML_PARSER_NON_LINEAR)
-+ return (0);
-+ } else {
-+ /*
-+ * strange we got no data for checking just return
-+ */
-+ return (0);
-+ }
-+
-+ xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
-+ return (1);
-+}
-+
- /**
- * xmlParserMaxDepth:
- *
-@@ -2260,6 +2349,10 @@ xmlStringLenDecodeEntities(xmlParserCtxt
- "String decoding Entity Reference: %.30s\n",
- str);
- ent = xmlParseStringEntityRef(ctxt, &str);
-+ if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP)
-+ goto int_error;
-+ if (ent != NULL)
-+ ctxt->nbentities += ent->owner;
- if ((ent != NULL) &&
- (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
- if (ent->content != NULL) {
-@@ -2284,6 +2377,10 @@ xmlStringLenDecodeEntities(xmlParserCtxt
- buffer[nbchars++] = *current++;
- if (nbchars >
- buffer_size - XML_PARSER_BUFFER_SIZE) {
-+ if (xmlParserEntityCheck(ctxt, nbchars, ent)) {
-+ xmlFree(rep);
-+ goto int_error;
-+ }
- growBuffer(buffer);
- }
- }
-@@ -2306,6 +2403,10 @@ xmlStringLenDecodeEntities(xmlParserCtxt
- xmlGenericError(xmlGenericErrorContext,
- "String decoding PE Reference: %.30s\n", str);
- ent = xmlParseStringPEReference(ctxt, &str);
-+ if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP)
-+ goto int_error;
-+ if (ent != NULL)
-+ ctxt->nbentities += ent->owner;
- if (ent != NULL) {
- xmlChar *rep;
-
-@@ -2319,6 +2420,10 @@ xmlStringLenDecodeEntities(xmlParserCtxt
- buffer[nbchars++] = *current++;
- if (nbchars >
- buffer_size - XML_PARSER_BUFFER_SIZE) {
-+ if (xmlParserEntityCheck(ctxt, nbchars, ent)) {
-+ xmlFree(rep);
-+ goto int_error;
-+ }
- growBuffer(buffer);
- }
- }
-@@ -2466,6 +2571,7 @@ xmlStringLenDecodeEntities(xmlParserCtxt
-
- mem_error:
- xmlErrMemory(ctxt, NULL);
-+int_error:
- if (rep != NULL)
- xmlFree(rep);
- if (buffer != NULL)
-@@ -3151,6 +3259,9 @@ xmlParseAttValueComplex(xmlParserCtxtPtr
- }
- } else {
- ent = xmlParseEntityRef(ctxt);
-+ ctxt->nbentities++;
-+ if (ent != NULL)
-+ ctxt->nbentities += ent->owner;
- if ((ent != NULL) &&
- (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
- if (len > buf_size - 10) {
-@@ -4433,6 +4544,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt
- int isParameter = 0;
- xmlChar *orig = NULL;
- int skipped;
-+ unsigned long oldnbent = ctxt->nbentities;
-
- /* GROW; done in the caller */
- if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) {
-@@ -4642,6 +4754,11 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt
- }
- }
- if (cur != NULL) {
-+ if ((cur->owner != 0) || (cur->children == NULL)) {
-+ cur->owner = ctxt->nbentities - oldnbent;
-+ if (cur->owner == 0)
-+ cur->owner = 1;
-+ }
- if (cur->orig != NULL)
- xmlFree(orig);
- else
-@@ -6071,7 +6188,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- (ent->children == NULL)) {
- ent->children = list;
- ent->last = list;
-- ent->owner = 1;
-+ if (ent->owner == 0)
-+ ent->owner = 1;
- list->parent = (xmlNodePtr) ent;
- } else {
- xmlFreeNodeList(list);
-@@ -6080,6 +6198,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- xmlFreeNodeList(list);
- }
- } else {
-+ unsigned long oldnbent = ctxt->nbentities;
- /*
- * 4.3.2: An internal general parsed entity is well-formed
- * if its replacement text matches the production labeled
-@@ -6102,6 +6221,7 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- ret = xmlParseBalancedChunkMemoryInternal(ctxt,
- value, user_data, &list);
- ctxt->depth--;
-+
- } else if (ent->etype ==
- XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
- ctxt->depth++;
-@@ -6114,6 +6234,24 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR,
- "invalid entity type found\n", NULL);
- }
-+ /*
-+ * Store the number of entities needing parsing for entity
-+ * content and do checkings
-+ */
-+ if ((ent->owner != 0) || (ent->children == NULL)) {
-+ ent->owner = ctxt->nbentities - oldnbent;
-+ if (ent->owner == 0)
-+ ent->owner = 1;
-+ }
-+ if (ret == XML_ERR_ENTITY_LOOP) {
-+ xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
-+ xmlFreeNodeList(list);
-+ return;
-+ }
-+ if (xmlParserEntityCheck(ctxt, 0, ent)) {
-+ xmlFreeNodeList(list);
-+ return;
-+ }
- if (ret == XML_ERR_ENTITY_LOOP) {
- xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
- return;
-@@ -6132,7 +6270,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- (ctxt->parseMode == XML_PARSE_READER)) {
- list->parent = (xmlNodePtr) ent;
- list = NULL;
-- ent->owner = 1;
-+ if (ent->owner == 0)
-+ ent->owner = 1;
- } else {
- ent->owner = 0;
- while (list != NULL) {
-@@ -6149,7 +6288,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- #endif /* LIBXML_LEGACY_ENABLED */
- }
- } else {
-- ent->owner = 1;
-+ if (ent->owner == 0)
-+ ent->owner = 1;
- while (list != NULL) {
- list->parent = (xmlNodePtr) ent;
- if (list->next == NULL)
-@@ -6326,7 +6466,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- break;
- cur = next;
- }
-- ent->owner = 1;
-+ if (ent->owner == 0)
-+ ent->owner = 1;
- #ifdef LIBXML_LEGACY_ENABLED
- if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)
- xmlAddEntityReference(ent, firstChild, nw);
-@@ -6357,6 +6498,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
- ctxt->nodelen = 0;
- return;
- }
-+ } else if (ent->owner != 1) {
-+ ctxt->nbentities += ent->owner;
- }
- } else {
- val = ent->content;
-@@ -6416,6 +6559,11 @@ xmlParseEntityRef(xmlParserCtxtPtr ctxt)
- if (RAW == ';') {
- NEXT;
- /*
-+ * Increase the number of entity references parsed
-+ */
-+ ctxt->nbentities++;
-+
-+ /*
- * Ask first SAX for entity resolution, otherwise try the
- * predefined set.
- */
-@@ -6587,6 +6735,10 @@ xmlParseStringEntityRef(xmlParserCtxtPtr
- if (*ptr == ';') {
- ptr++;
- /*
-+ * Increase the number of entity references parsed
-+ */
-+ ctxt->nbentities++;
-+ /*
- * Ask first SAX for entity resolution, otherwise try the
- * predefined set.
- */
-@@ -6748,6 +6900,11 @@ xmlParsePEReference(xmlParserCtxtPtr ctx
- } else {
- if (RAW == ';') {
- NEXT;
-+ /*
-+ * Increase the number of entity references parsed
-+ */
-+ ctxt->nbentities++;
-+
- if ((ctxt->sax != NULL) &&
- (ctxt->sax->getParameterEntity != NULL))
- entity = ctxt->sax->getParameterEntity(ctxt->userData,
-@@ -6878,6 +7035,11 @@ xmlParseStringPEReference(xmlParserCtxtP
- if (cur == ';') {
- ptr++;
- cur = *ptr;
-+ /*
-+ * Increase the number of entity references parsed
-+ */
-+ ctxt->nbentities++;
-+
- if ((ctxt->sax != NULL) &&
- (ctxt->sax->getParameterEntity != NULL))
- entity = ctxt->sax->getParameterEntity(ctxt->userData,
-@@ -11537,11 +11699,31 @@ xmlParseExternalEntityPrivate(xmlDocPtr
- }
- ret = XML_ERR_OK;
- }
-+
-+ /*
-+ * Record in the parent context the number of entities replacement
-+ * done when parsing that reference.
-+ */
-+ oldctxt->nbentities += ctxt->nbentities;
-+ /*
-+ * Also record the size of the entity parsed
-+ */
-+ if (ctxt->input != NULL) {
-+ oldctxt->sizeentities += ctxt->input->consumed;
-+ oldctxt->sizeentities += (ctxt->input->cur - ctxt->input->base);
-+ }
-+ /*
-+ * And record the last error if any
-+ */
-+ if (ctxt->lastError.code != XML_ERR_OK)
-+ xmlCopyError(&ctxt->lastError, &oldctxt->lastError);
-+
- if (sax != NULL)
- ctxt->sax = oldsax;
- oldctxt->node_seq.maximum = ctxt->node_seq.maximum;
- oldctxt->node_seq.length = ctxt->node_seq.length;
- oldctxt->node_seq.buffer = ctxt->node_seq.buffer;
-+ oldctxt->nbentities += ctxt->nbentities;
- ctxt->node_seq.maximum = 0;
- ctxt->node_seq.length = 0;
- ctxt->node_seq.buffer = NULL;
-@@ -11766,6 +11948,17 @@ xmlParseBalancedChunkMemoryInternal(xmlP
- ctxt->myDoc->last = last;
- }
-
-+ /*
-+ * Record in the parent context the number of entities replacement
-+ * done when parsing that reference.
-+ */
-+ oldctxt->nbentities += ctxt->nbentities;
-+ /*
-+ * Also record the last error if any
-+ */
-+ if (ctxt->lastError.code != XML_ERR_OK)
-+ xmlCopyError(&ctxt->lastError, &oldctxt->lastError);
-+
- ctxt->sax = oldsax;
- ctxt->dict = NULL;
- ctxt->attsDefault = NULL;
-@@ -13077,6 +13270,8 @@ xmlCtxtReset(xmlParserCtxtPtr ctxt)
- ctxt->depth = 0;
- ctxt->charset = XML_CHAR_ENCODING_UTF8;
- ctxt->catalogs = NULL;
-+ ctxt->nbentities = 0;
-+ ctxt->sizeentities = 0;
- xmlInitNodeInfoSeq(&ctxt->node_seq);
-
- if (ctxt->attsDefault != NULL) {
-diff -pruN libxml2-2.6.31.cve-2008-3281/parserInternals.c libxml2-2.6.31/parserInternals.c
---- libxml2-2.6.31.cve-2008-3281/parserInternals.c 2007-12-14 06:17:14.000000000 -0500
-+++ parserInternals.c 2008-09-11 16:08:42.000000000 -0400
-@@ -1669,6 +1669,7 @@ xmlInitParserCtxt(xmlParserCtxtPtr ctxt)
- ctxt->depth = 0;
- ctxt->charset = XML_CHAR_ENCODING_UTF8;
- ctxt->catalogs = NULL;
-+ ctxt->nbentities = 0;
- xmlInitNodeInfoSeq(&ctxt->node_seq);
- return(0);
- }