@@ -1550,7 +1550,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
15501550 else if (bufferPtr == bufferEnd ) {
15511551 const char * end ;
15521552 int nLeftOver ;
1553- enum XML_Error result ;
1553+ enum XML_Status result ;
15541554 parseEndByteIndex += len ;
15551555 positionPtr = s ;
15561556 ps_finalBuffer = (XML_Bool )isFinal ;
@@ -1678,6 +1678,10 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
16781678void * XMLCALL
16791679XML_GetBuffer (XML_Parser parser , int len )
16801680{
1681+ if (len < 0 ) {
1682+ errorCode = XML_ERROR_NO_MEMORY ;
1683+ return NULL ;
1684+ }
16811685 switch (ps_parsing ) {
16821686 case XML_SUSPENDED :
16831687 errorCode = XML_ERROR_SUSPENDED ;
@@ -1689,10 +1693,16 @@ XML_GetBuffer(XML_Parser parser, int len)
16891693 }
16901694
16911695 if (len > bufferLim - bufferEnd ) {
1692- /* FIXME avoid integer overflow */
1696+ #ifdef XML_CONTEXT_BYTES
1697+ int keep ;
1698+ #endif
16931699 int neededSize = len + (int )(bufferEnd - bufferPtr );
1700+ if (neededSize < 0 ) {
1701+ errorCode = XML_ERROR_NO_MEMORY ;
1702+ return NULL ;
1703+ }
16941704#ifdef XML_CONTEXT_BYTES
1695- int keep = (int )(bufferPtr - buffer );
1705+ keep = (int )(bufferPtr - buffer );
16961706
16971707 if (keep > XML_CONTEXT_BYTES )
16981708 keep = XML_CONTEXT_BYTES ;
@@ -1719,7 +1729,11 @@ XML_GetBuffer(XML_Parser parser, int len)
17191729 bufferSize = INIT_BUFFER_SIZE ;
17201730 do {
17211731 bufferSize *= 2 ;
1722- } while (bufferSize < neededSize );
1732+ } while (bufferSize < neededSize && bufferSize > 0 );
1733+ if (bufferSize <= 0 ) {
1734+ errorCode = XML_ERROR_NO_MEMORY ;
1735+ return NULL ;
1736+ }
17231737 newBuf = (char * )MALLOC (bufferSize );
17241738 if (newBuf == 0 ) {
17251739 errorCode = XML_ERROR_NO_MEMORY ;
@@ -2911,6 +2925,8 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
29112925 unsigned long uriHash = hash_secret_salt ;
29122926 ((XML_Char * )s )[-1 ] = 0 ; /* clear flag */
29132927 id = (ATTRIBUTE_ID * )lookup (parser , & dtd -> attributeIds , s , 0 );
2928+ if (!id || !id -> prefix )
2929+ return XML_ERROR_NO_MEMORY ;
29142930 b = id -> prefix -> binding ;
29152931 if (!b )
29162932 return XML_ERROR_UNBOUND_PREFIX ;
@@ -5475,6 +5491,8 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
54755491 return NULL ;
54765492 id -> prefix = (PREFIX * )lookup (parser , & dtd -> prefixes , poolStart (& dtd -> pool ),
54775493 sizeof (PREFIX ));
5494+ if (!id -> prefix )
5495+ return NULL ;
54785496 if (id -> prefix -> name == poolStart (& dtd -> pool ))
54795497 poolFinish (& dtd -> pool );
54805498 else
0 commit comments