609 lines
21 KiB
Diff
609 lines
21 KiB
Diff
From 0ba081320110360296b353fecfeaf63bfc6434a9 Mon Sep 17 00:00:00 2001
|
|
From: tanjinghui1 <tanjinghui1@huawei.com>
|
|
Date: Mon, 14 Nov 2022 18:56:43 +0800
|
|
Subject: [PATCH] [Backport]libxml2:Integer overflow in xmlParseNameComplex
|
|
CVE: CVE-2022-40303
|
|
Reference: https://gitlab.gnome.org/GNOME/libxml2/-/commit/c846986356fc149915a74972bf198ab
|
|
---
|
|
parser.c | 233 +++++++++++++++++++++++++++++++++------------------------------
|
|
1 file changed, 121 insertions(+), 112 deletions(-)
|
|
|
|
diff --git a/parser.c b/parser.c
|
|
index 8ca9b2d..0fd47dd 100644
|
|
--- a/parser.c
|
|
+++ b/parser.c
|
|
@@ -115,6 +115,8 @@ xmlParseElementEnd(xmlParserCtxtPtr ctxt);
|
|
* *
|
|
************************************************************************/
|
|
|
|
+#define XML_MAX_HUGE_LENGTH 1000000000
|
|
+
|
|
#define XML_PARSER_BIG_ENTITY 1000
|
|
#define XML_PARSER_LOT_ENTITY 5000
|
|
|
|
@@ -565,7 +567,7 @@ xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info)
|
|
errmsg = "Malformed declaration expecting version";
|
|
break;
|
|
case XML_ERR_NAME_TOO_LONG:
|
|
- errmsg = "Name too long use XML_PARSE_HUGE option";
|
|
+ errmsg = "Name too long";
|
|
break;
|
|
#if 0
|
|
case:
|
|
@@ -3208,6 +3210,9 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
|
|
int len = 0, l;
|
|
int c;
|
|
int count = 0;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
|
|
#ifdef DEBUG
|
|
nbParseNameComplex++;
|
|
@@ -3273,7 +3278,8 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
|
|
if (ctxt->instate == XML_PARSER_EOF)
|
|
return(NULL);
|
|
}
|
|
- len += l;
|
|
+ if (len <= INT_MAX - l)
|
|
+ len += l;
|
|
NEXTL(l);
|
|
c = CUR_CHAR(l);
|
|
}
|
|
@@ -3299,13 +3305,13 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
|
|
if (ctxt->instate == XML_PARSER_EOF)
|
|
return(NULL);
|
|
}
|
|
- len += l;
|
|
+ if (len <= INT_MAX - l)
|
|
+ len += l;
|
|
NEXTL(l);
|
|
c = CUR_CHAR(l);
|
|
}
|
|
}
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (len > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
|
|
return(NULL);
|
|
}
|
|
@@ -3344,7 +3350,10 @@ const xmlChar *
|
|
xmlParseName(xmlParserCtxtPtr ctxt) {
|
|
const xmlChar *in;
|
|
const xmlChar *ret;
|
|
- int count = 0;
|
|
+ size_t count = 0;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
|
|
GROW;
|
|
|
|
@@ -3368,8 +3377,7 @@ xmlParseName(xmlParserCtxtPtr ctxt) {
|
|
in++;
|
|
if ((*in > 0) && (*in < 0x80)) {
|
|
count = in - ctxt->input->cur;
|
|
- if ((count > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (count > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
|
|
return(NULL);
|
|
}
|
|
@@ -3390,6 +3398,9 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
|
|
int len = 0, l;
|
|
int c;
|
|
int count = 0;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
size_t startPosition = 0;
|
|
|
|
#ifdef DEBUG
|
|
@@ -3410,17 +3421,13 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
|
|
while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
|
|
(xmlIsNameChar(ctxt, c) && (c != ':'))) {
|
|
if (count++ > XML_PARSER_CHUNK_SIZE) {
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
- return(NULL);
|
|
- }
|
|
count = 0;
|
|
GROW;
|
|
if (ctxt->instate == XML_PARSER_EOF)
|
|
return(NULL);
|
|
}
|
|
- len += l;
|
|
+ if (len <= INT_MAX - l)
|
|
+ len += l;
|
|
NEXTL(l);
|
|
c = CUR_CHAR(l);
|
|
if (c == 0) {
|
|
@@ -3438,8 +3445,7 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
|
|
c = CUR_CHAR(l);
|
|
}
|
|
}
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (len > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
return(NULL);
|
|
}
|
|
@@ -3465,7 +3471,10 @@ static const xmlChar *
|
|
xmlParseNCName(xmlParserCtxtPtr ctxt) {
|
|
const xmlChar *in, *e;
|
|
const xmlChar *ret;
|
|
- int count = 0;
|
|
+ size_t count = 0;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
|
|
#ifdef DEBUG
|
|
nbParseNCName++;
|
|
@@ -3490,8 +3499,7 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) {
|
|
goto complex;
|
|
if ((*in > 0) && (*in < 0x80)) {
|
|
count = in - ctxt->input->cur;
|
|
- if ((count > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (count > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
return(NULL);
|
|
}
|
|
@@ -3573,6 +3581,9 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
|
|
const xmlChar *cur = *str;
|
|
int len = 0, l;
|
|
int c;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
|
|
#ifdef DEBUG
|
|
nbParseStringName++;
|
|
@@ -3608,12 +3619,6 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
|
|
if (len + 10 > max) {
|
|
xmlChar *tmp;
|
|
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
- xmlFree(buffer);
|
|
- return(NULL);
|
|
- }
|
|
max *= 2;
|
|
tmp = (xmlChar *) xmlRealloc(buffer,
|
|
max * sizeof(xmlChar));
|
|
@@ -3627,14 +3632,18 @@ xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) {
|
|
COPY_BUF(l,buffer,len,c);
|
|
cur += l;
|
|
c = CUR_SCHAR(cur, l);
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
+ xmlFree(buffer);
|
|
+ return(NULL);
|
|
+ }
|
|
}
|
|
buffer[len] = 0;
|
|
*str = cur;
|
|
return(buffer);
|
|
}
|
|
}
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (len > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
|
|
return(NULL);
|
|
}
|
|
@@ -3661,6 +3670,9 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
|
|
int len = 0, l;
|
|
int c;
|
|
int count = 0;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
|
|
#ifdef DEBUG
|
|
nbParseNmToken++;
|
|
@@ -3712,12 +3724,6 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
|
|
if (len + 10 > max) {
|
|
xmlChar *tmp;
|
|
|
|
- if ((max > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken");
|
|
- xmlFree(buffer);
|
|
- return(NULL);
|
|
- }
|
|
max *= 2;
|
|
tmp = (xmlChar *) xmlRealloc(buffer,
|
|
max * sizeof(xmlChar));
|
|
@@ -3731,6 +3737,11 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
|
|
COPY_BUF(l,buffer,len,c);
|
|
NEXTL(l);
|
|
c = CUR_CHAR(l);
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken");
|
|
+ xmlFree(buffer);
|
|
+ return(NULL);
|
|
+ }
|
|
}
|
|
buffer[len] = 0;
|
|
return(buffer);
|
|
@@ -3738,8 +3749,7 @@ xmlParseNmtoken(xmlParserCtxtPtr ctxt) {
|
|
}
|
|
if (len == 0)
|
|
return(NULL);
|
|
- if ((len > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (len > maxLength) {
|
|
xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken");
|
|
return(NULL);
|
|
}
|
|
@@ -3765,6 +3775,9 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) {
|
|
int len = 0;
|
|
int size = XML_PARSER_BUFFER_SIZE;
|
|
int c, l;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
xmlChar stop;
|
|
xmlChar *ret = NULL;
|
|
const xmlChar *cur = NULL;
|
|
@@ -3824,6 +3837,12 @@ xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) {
|
|
GROW;
|
|
c = CUR_CHAR(l);
|
|
}
|
|
+
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_NOT_FINISHED,
|
|
+ "entity value too long\n");
|
|
+ goto error;
|
|
+ }
|
|
}
|
|
buf[len] = 0;
|
|
if (ctxt->instate == XML_PARSER_EOF)
|
|
@@ -3911,6 +3930,9 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) {
|
|
xmlChar *rep = NULL;
|
|
size_t len = 0;
|
|
size_t buf_size = 0;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
int c, l, in_space = 0;
|
|
xmlChar *current = NULL;
|
|
xmlEntityPtr ent;
|
|
@@ -3942,16 +3964,6 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) {
|
|
while (((NXT(0) != limit) && /* checked */
|
|
(IS_CHAR(c)) && (c != '<')) &&
|
|
(ctxt->instate != XML_PARSER_EOF)) {
|
|
- /*
|
|
- * Impose a reasonable limit on attribute size, unless XML_PARSE_HUGE
|
|
- * special option is given
|
|
- */
|
|
- if ((len > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
- "AttValue length too long\n");
|
|
- goto mem_error;
|
|
- }
|
|
if (c == '&') {
|
|
in_space = 0;
|
|
if (NXT(1) == '#') {
|
|
@@ -4099,6 +4111,11 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) {
|
|
}
|
|
GROW;
|
|
c = CUR_CHAR(l);
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
+ "AttValue length too long\n");
|
|
+ goto mem_error;
|
|
+ }
|
|
}
|
|
if (ctxt->instate == XML_PARSER_EOF)
|
|
goto error;
|
|
@@ -4120,16 +4137,6 @@ xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) {
|
|
} else
|
|
NEXT;
|
|
|
|
- /*
|
|
- * There we potentially risk an overflow, don't allow attribute value of
|
|
- * length more than INT_MAX it is a very reasonable assumption !
|
|
- */
|
|
- if (len >= INT_MAX) {
|
|
- xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
- "AttValue length too long\n");
|
|
- goto mem_error;
|
|
- }
|
|
-
|
|
if (attlen != NULL) *attlen = (int) len;
|
|
return(buf);
|
|
|
|
@@ -4200,6 +4207,9 @@ xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
|
|
int len = 0;
|
|
int size = XML_PARSER_BUFFER_SIZE;
|
|
int cur, l;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
xmlChar stop;
|
|
int state = ctxt->instate;
|
|
int count = 0;
|
|
@@ -4227,13 +4237,6 @@ xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
|
|
if (len + 5 >= size) {
|
|
xmlChar *tmp;
|
|
|
|
- if ((size > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral");
|
|
- xmlFree(buf);
|
|
- ctxt->instate = (xmlParserInputState) state;
|
|
- return(NULL);
|
|
- }
|
|
size *= 2;
|
|
tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
|
|
if (tmp == NULL) {
|
|
@@ -4262,6 +4265,12 @@ xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) {
|
|
SHRINK;
|
|
cur = CUR_CHAR(l);
|
|
}
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral");
|
|
+ xmlFree(buf);
|
|
+ ctxt->instate = (xmlParserInputState) state;
|
|
+ return(NULL);
|
|
+ }
|
|
}
|
|
buf[len] = 0;
|
|
ctxt->instate = (xmlParserInputState) state;
|
|
@@ -4289,6 +4298,9 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
|
|
xmlChar *buf = NULL;
|
|
int len = 0;
|
|
int size = XML_PARSER_BUFFER_SIZE;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_TEXT_LENGTH :
|
|
+ XML_MAX_NAME_LENGTH;
|
|
xmlChar cur;
|
|
xmlChar stop;
|
|
int count = 0;
|
|
@@ -4316,12 +4328,6 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
|
|
if (len + 1 >= size) {
|
|
xmlChar *tmp;
|
|
|
|
- if ((size > XML_MAX_NAME_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID");
|
|
- xmlFree(buf);
|
|
- return(NULL);
|
|
- }
|
|
size *= 2;
|
|
tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
|
|
if (tmp == NULL) {
|
|
@@ -4349,6 +4355,11 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
|
|
SHRINK;
|
|
cur = CUR;
|
|
}
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID");
|
|
+ xmlFree(buf);
|
|
+ return(NULL);
|
|
+ }
|
|
}
|
|
buf[len] = 0;
|
|
if (cur != stop) {
|
|
@@ -4748,6 +4759,9 @@ xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf,
|
|
int r, rl;
|
|
int cur, l;
|
|
size_t count = 0;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
int inputid;
|
|
|
|
inputid = ctxt->input->id;
|
|
@@ -4793,13 +4807,6 @@ xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf,
|
|
if ((r == '-') && (q == '-')) {
|
|
xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL);
|
|
}
|
|
- if ((len > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
|
|
- "Comment too big found", NULL);
|
|
- xmlFree (buf);
|
|
- return;
|
|
- }
|
|
if (len + 5 >= size) {
|
|
xmlChar *new_buf;
|
|
size_t new_size;
|
|
@@ -4837,6 +4844,13 @@ xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf,
|
|
GROW;
|
|
cur = CUR_CHAR(l);
|
|
}
|
|
+
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
|
|
+ "Comment too big found", NULL);
|
|
+ xmlFree (buf);
|
|
+ return;
|
|
+ }
|
|
}
|
|
buf[len] = 0;
|
|
if (cur == 0) {
|
|
@@ -4881,6 +4895,9 @@ xmlParseComment(xmlParserCtxtPtr ctxt) {
|
|
xmlChar *buf = NULL;
|
|
size_t size = XML_PARSER_BUFFER_SIZE;
|
|
size_t len = 0;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
xmlParserInputState state;
|
|
const xmlChar *in;
|
|
size_t nbchar = 0;
|
|
@@ -4964,8 +4981,7 @@ get_more:
|
|
buf[len] = 0;
|
|
}
|
|
}
|
|
- if ((len > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if (len > maxLength) {
|
|
xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
|
|
"Comment too big found", NULL);
|
|
xmlFree (buf);
|
|
@@ -5165,6 +5181,9 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
|
|
xmlChar *buf = NULL;
|
|
size_t len = 0;
|
|
size_t size = XML_PARSER_BUFFER_SIZE;
|
|
+ size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
int cur, l;
|
|
const xmlChar *target;
|
|
xmlParserInputState state;
|
|
@@ -5240,14 +5259,6 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
|
|
return;
|
|
}
|
|
count = 0;
|
|
- if ((len > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
|
|
- "PI %s too big found", target);
|
|
- xmlFree(buf);
|
|
- ctxt->instate = state;
|
|
- return;
|
|
- }
|
|
}
|
|
COPY_BUF(l,buf,len,cur);
|
|
NEXTL(l);
|
|
@@ -5257,15 +5268,14 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
|
|
GROW;
|
|
cur = CUR_CHAR(l);
|
|
}
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
|
|
+ "PI %s too big found", target);
|
|
+ xmlFree(buf);
|
|
+ ctxt->instate = state;
|
|
+ return;
|
|
+ }
|
|
}
|
|
- if ((len > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
|
|
- "PI %s too big found", target);
|
|
- xmlFree(buf);
|
|
- ctxt->instate = state;
|
|
- return;
|
|
- }
|
|
buf[len] = 0;
|
|
if (cur != '?') {
|
|
xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
|
|
@@ -8957,6 +8967,9 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
const xmlChar *in = NULL, *start, *end, *last;
|
|
xmlChar *ret = NULL;
|
|
int line, col;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
|
|
GROW;
|
|
in = (xmlChar *) CUR_PTR;
|
|
@@ -8996,8 +9009,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
start = in;
|
|
if (in >= end) {
|
|
GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
@@ -9010,8 +9022,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
if ((*in++ == 0x20) && (*in == 0x20)) break;
|
|
if (in >= end) {
|
|
GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
@@ -9044,16 +9055,14 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
last = last + delta;
|
|
}
|
|
end = ctxt->input->end;
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
}
|
|
}
|
|
}
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
@@ -9066,8 +9075,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
col++;
|
|
if (in >= end) {
|
|
GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
@@ -9075,8 +9083,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
|
|
}
|
|
}
|
|
last = in;
|
|
- if (((in - start) > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
+ if ((in - start) > maxLength) {
|
|
xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
|
|
"AttValue length too long\n");
|
|
return(NULL);
|
|
@@ -9766,6 +9773,9 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
|
|
int s, sl;
|
|
int cur, l;
|
|
int count = 0;
|
|
+ int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
|
|
+ XML_MAX_HUGE_LENGTH :
|
|
+ XML_MAX_TEXT_LENGTH;
|
|
|
|
/* Check 2.6.0 was NXT(0) not RAW */
|
|
if (CMP9(CUR_PTR, '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[')) {
|
|
@@ -9799,13 +9809,6 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
|
|
if (len + 5 >= size) {
|
|
xmlChar *tmp;
|
|
|
|
- if ((size > XML_MAX_TEXT_LENGTH) &&
|
|
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
|
|
- xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED,
|
|
- "CData section too big found", NULL);
|
|
- xmlFree (buf);
|
|
- return;
|
|
- }
|
|
tmp = (xmlChar *) xmlRealloc(buf, size * 2 * sizeof(xmlChar));
|
|
if (tmp == NULL) {
|
|
xmlFree(buf);
|
|
@@ -9832,6 +9835,12 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
|
|
}
|
|
NEXTL(l);
|
|
cur = CUR_CHAR(l);
|
|
+ if (len > maxLength) {
|
|
+ xmlFatalErrMsg(ctxt, XML_ERR_CDATA_NOT_FINISHED,
|
|
+ "CData section too big found\n");
|
|
+ xmlFree(buf);
|
|
+ return;
|
|
+ }
|
|
}
|
|
buf[len] = 0;
|
|
ctxt->instate = XML_PARSER_CONTENT;
|
|
--
|
|
2.1.4
|
|
|