Skip to content

Commit 51749fb

Browse files
paulduffinandi34
authored andcommitted
Fix CVE-2016-0718: Expat XML Parser Crashes on Malformed Input
Includes all changes made on the cve-2016-0718-fix-2-2-1 branch that was merged into the master branch in commit be4b1c06daba1849b8ff5e00bae5caf47f6c39fd in repository http://git.code.sf.net/p/expat/code_git (cherry picked from commit 7b64b72da916c9c9c285939c11f81de938268fa9) Bug: 28698301 Change-Id: I9fe93040b3a9afb04be63c5fd453a2b99c01fb37 (cherry picked from commit 4bf8f12b1d505770ce1fd3b5aa33bd7abe46ee74)
1 parent b982292 commit 51749fb

File tree

4 files changed

+145
-74
lines changed

4 files changed

+145
-74
lines changed

lib/xmlparse.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,11 +2426,11 @@ doContent(XML_Parser parser,
24262426
for (;;) {
24272427
int bufSize;
24282428
int convLen;
2429-
XmlConvert(enc,
2429+
const enum XML_Convert_Result convert_res = XmlConvert(enc,
24302430
&fromPtr, rawNameEnd,
24312431
(ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
24322432
convLen = (int)(toPtr - (XML_Char *)tag->buf);
2433-
if (fromPtr == rawNameEnd) {
2433+
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) {
24342434
tag->name.strLen = convLen;
24352435
break;
24362436
}
@@ -2651,11 +2651,11 @@ doContent(XML_Parser parser,
26512651
if (MUST_CONVERT(enc, s)) {
26522652
for (;;) {
26532653
ICHAR *dataPtr = (ICHAR *)dataBuf;
2654-
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
2654+
const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
26552655
*eventEndPP = s;
26562656
charDataHandler(handlerArg, dataBuf,
26572657
(int)(dataPtr - (ICHAR *)dataBuf));
2658-
if (s == next)
2658+
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
26592659
break;
26602660
*eventPP = s;
26612661
}
@@ -3261,11 +3261,11 @@ doCdataSection(XML_Parser parser,
32613261
if (MUST_CONVERT(enc, s)) {
32623262
for (;;) {
32633263
ICHAR *dataPtr = (ICHAR *)dataBuf;
3264-
XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
3264+
const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
32653265
*eventEndPP = next;
32663266
charDataHandler(handlerArg, dataBuf,
32673267
(int)(dataPtr - (ICHAR *)dataBuf));
3268-
if (s == next)
3268+
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
32693269
break;
32703270
*eventPP = s;
32713271
}
@@ -5342,6 +5342,7 @@ reportDefault(XML_Parser parser, const ENCODING *enc,
53425342
const char *s, const char *end)
53435343
{
53445344
if (MUST_CONVERT(enc, s)) {
5345+
enum XML_Convert_Result convert_res;
53455346
const char **eventPP;
53465347
const char **eventEndPP;
53475348
if (enc == encoding) {
@@ -5354,11 +5355,11 @@ reportDefault(XML_Parser parser, const ENCODING *enc,
53545355
}
53555356
do {
53565357
ICHAR *dataPtr = (ICHAR *)dataBuf;
5357-
XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
5358+
convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
53585359
*eventEndPP = s;
53595360
defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));
53605361
*eventPP = s;
5361-
} while (s != end);
5362+
} while ((convert_res != XML_CONVERT_COMPLETED) && (convert_res != XML_CONVERT_INPUT_INCOMPLETE));
53625363
}
53635364
else
53645365
defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
@@ -6163,8 +6164,8 @@ poolAppend(STRING_POOL *pool, const ENCODING *enc,
61636164
if (!pool->ptr && !poolGrow(pool))
61646165
return NULL;
61656166
for (;;) {
6166-
XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
6167-
if (ptr == end)
6167+
const enum XML_Convert_Result convert_res = XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
6168+
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
61686169
break;
61696170
if (!poolGrow(pool))
61706171
return NULL;
@@ -6248,8 +6249,13 @@ poolGrow(STRING_POOL *pool)
62486249
}
62496250
}
62506251
if (pool->blocks && pool->start == pool->blocks->s) {
6252+
BLOCK *temp;
62516253
int blockSize = (int)(pool->end - pool->start)*2;
6252-
BLOCK *temp = (BLOCK *)
6254+
6255+
if (blockSize < 0)
6256+
return XML_FALSE;
6257+
6258+
temp = (BLOCK *)
62536259
pool->mem->realloc_fcn(pool->blocks,
62546260
(offsetof(BLOCK, s)
62556261
+ blockSize * sizeof(XML_Char)));
@@ -6264,6 +6270,10 @@ poolGrow(STRING_POOL *pool)
62646270
else {
62656271
BLOCK *tem;
62666272
int blockSize = (int)(pool->end - pool->start);
6273+
6274+
if (blockSize < 0)
6275+
return XML_FALSE;
6276+
62676277
if (blockSize < INIT_BLOCK_SIZE)
62686278
blockSize = INIT_BLOCK_SIZE;
62696279
else

0 commit comments

Comments
 (0)