import libxml2-2.9.13-3.el9_1
This commit is contained in:
		
							parent
							
								
									d2cbdf2362
								
							
						
					
					
						commit
						cfc9cf9b88
					
				
							
								
								
									
										618
									
								
								SOURCES/libxml2-2.9.13-CVE-2022-40303.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										618
									
								
								SOURCES/libxml2-2.9.13-CVE-2022-40303.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,618 @@ | |||||||
|  | From c846986356fc149915a74972bf198abc266bc2c0 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Nick Wellnhofer <wellnhofer@aevum.de> | ||||||
|  | Date: Thu, 25 Aug 2022 17:43:08 +0200 | ||||||
|  | Subject: [PATCH] [CVE-2022-40303] Fix integer overflows with XML_PARSE_HUGE | ||||||
|  | 
 | ||||||
|  | Also impose size limits when XML_PARSE_HUGE is set. Limit size of names | ||||||
|  | to XML_MAX_TEXT_LENGTH (10 million bytes) and other content to | ||||||
|  | XML_MAX_HUGE_LENGTH (1 billion bytes). | ||||||
|  | 
 | ||||||
|  | Move some the length checks to the end of the respective loop to make | ||||||
|  | them strict. | ||||||
|  | 
 | ||||||
|  | xmlParseEntityValue didn't have a length limitation at all. But without | ||||||
|  | XML_PARSE_HUGE, this should eventually trigger an error in xmlGROW. | ||||||
|  | 
 | ||||||
|  | Thanks to Maddie Stone working with Google Project Zero for the report! | ||||||
|  | ---
 | ||||||
|  |  parser.c | 233 +++++++++++++++++++++++++++++-------------------------- | ||||||
|  |  1 file changed, 121 insertions(+), 112 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/parser.c b/parser.c
 | ||||||
|  | index 93f031be..79479979 100644
 | ||||||
|  | --- a/parser.c
 | ||||||
|  | +++ b/parser.c
 | ||||||
|  | @@ -102,6 +102,8 @@ xmlParseElementEnd(xmlParserCtxtPtr ctxt);
 | ||||||
|  |   *									* | ||||||
|  |   ************************************************************************/ | ||||||
|  |   | ||||||
|  | +#define XML_MAX_HUGE_LENGTH 1000000000
 | ||||||
|  | +
 | ||||||
|  |  #define XML_PARSER_BIG_ENTITY 1000 | ||||||
|  |  #define XML_PARSER_LOT_ENTITY 5000 | ||||||
|  |   | ||||||
|  | @@ -552,7 +554,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: | ||||||
|  | @@ -3202,6 +3204,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++; | ||||||
|  | @@ -3267,7 +3272,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); | ||||||
|  |  	} | ||||||
|  | @@ -3293,13 +3299,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); | ||||||
|  |      } | ||||||
|  | @@ -3338,7 +3344,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; | ||||||
|  |   | ||||||
|  | @@ -3362,8 +3371,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); | ||||||
|  |              } | ||||||
|  | @@ -3384,6 +3392,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 | ||||||
|  | @@ -3404,17 +3415,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) { | ||||||
|  | @@ -3432,8 +3439,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); | ||||||
|  |      } | ||||||
|  | @@ -3459,7 +3465,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++; | ||||||
|  | @@ -3484,8 +3493,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); | ||||||
|  |              } | ||||||
|  | @@ -3567,6 +3575,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++; | ||||||
|  | @@ -3602,12 +3613,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)); | ||||||
|  | @@ -3621,14 +3626,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); | ||||||
|  |      } | ||||||
|  | @@ -3655,6 +3664,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++; | ||||||
|  | @@ -3706,12 +3718,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)); | ||||||
|  | @@ -3725,6 +3731,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); | ||||||
|  | @@ -3732,8 +3743,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); | ||||||
|  |      } | ||||||
|  | @@ -3759,6 +3769,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; | ||||||
|  | @@ -3818,6 +3831,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) | ||||||
|  | @@ -3905,6 +3924,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; | ||||||
|  | @@ -3936,16 +3958,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) == '#') { | ||||||
|  | @@ -4093,6 +4105,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; | ||||||
|  | @@ -4114,16 +4131,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); | ||||||
|  |   | ||||||
|  | @@ -4194,6 +4201,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; | ||||||
|  | @@ -4221,13 +4231,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) { | ||||||
|  | @@ -4256,6 +4259,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; | ||||||
|  | @@ -4283,6 +4292,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; | ||||||
|  | @@ -4310,12 +4322,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) { | ||||||
|  | @@ -4343,6 +4349,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) { | ||||||
|  | @@ -4742,6 +4753,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; | ||||||
|  | @@ -4787,13 +4801,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; | ||||||
|  | @@ -4831,6 +4838,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) { | ||||||
|  | @@ -4875,6 +4889,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; | ||||||
|  | @@ -4958,8 +4975,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); | ||||||
|  | @@ -5159,6 +5175,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; | ||||||
|  | @@ -5234,14 +5253,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); | ||||||
|  | @@ -5251,15 +5262,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, | ||||||
|  | @@ -8954,6 +8964,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; | ||||||
|  | @@ -8993,8 +9006,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); | ||||||
|  | @@ -9007,8 +9019,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); | ||||||
|  | @@ -9041,16 +9052,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); | ||||||
|  | @@ -9063,8 +9072,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); | ||||||
|  | @@ -9072,8 +9080,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); | ||||||
|  | @@ -9763,6 +9770,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', '[')) { | ||||||
|  | @@ -9796,13 +9806,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); | ||||||
|  | @@ -9829,6 +9832,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; | ||||||
|  | -- 
 | ||||||
|  | GitLab | ||||||
|  | 
 | ||||||
							
								
								
									
										101
									
								
								SOURCES/libxml2-2.9.13-CVE-2022-40304.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								SOURCES/libxml2-2.9.13-CVE-2022-40304.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | |||||||
|  | From 1b41ec4e9433b05bb0376be4725804c54ef1d80b Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Nick Wellnhofer <wellnhofer@aevum.de> | ||||||
|  | Date: Wed, 31 Aug 2022 22:11:25 +0200 | ||||||
|  | Subject: [PATCH] [CVE-2022-40304] Fix dict corruption caused by entity | ||||||
|  |  reference cycles | ||||||
|  | 
 | ||||||
|  | When an entity reference cycle is detected, the entity content is | ||||||
|  | cleared by setting its first byte to zero. But the entity content might | ||||||
|  | be allocated from a dict. In this case, the dict entry becomes corrupted | ||||||
|  | leading to all kinds of logic errors, including memory errors like | ||||||
|  | double-frees. | ||||||
|  | 
 | ||||||
|  | Stop storing entity content, orig, ExternalID and SystemID in a dict. | ||||||
|  | These values are unlikely to occur multiple times in a document, so they | ||||||
|  | shouldn't have been stored in a dict in the first place. | ||||||
|  | 
 | ||||||
|  | Thanks to Ned Williamson and Nathan Wachholz working with Google Project | ||||||
|  | Zero for the report! | ||||||
|  | ---
 | ||||||
|  |  entities.c | 55 ++++++++++++++++-------------------------------------- | ||||||
|  |  1 file changed, 16 insertions(+), 39 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/entities.c b/entities.c
 | ||||||
|  | index 84435515..d4e5412e 100644
 | ||||||
|  | --- a/entities.c
 | ||||||
|  | +++ b/entities.c
 | ||||||
|  | @@ -128,36 +128,19 @@ xmlFreeEntity(xmlEntityPtr entity)
 | ||||||
|  |      if ((entity->children) && (entity->owner == 1) && | ||||||
|  |          (entity == (xmlEntityPtr) entity->children->parent)) | ||||||
|  |          xmlFreeNodeList(entity->children); | ||||||
|  | -    if (dict != NULL) {
 | ||||||
|  | -        if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name)))
 | ||||||
|  | -            xmlFree((char *) entity->name);
 | ||||||
|  | -        if ((entity->ExternalID != NULL) &&
 | ||||||
|  | -	    (!xmlDictOwns(dict, entity->ExternalID)))
 | ||||||
|  | -            xmlFree((char *) entity->ExternalID);
 | ||||||
|  | -        if ((entity->SystemID != NULL) &&
 | ||||||
|  | -	    (!xmlDictOwns(dict, entity->SystemID)))
 | ||||||
|  | -            xmlFree((char *) entity->SystemID);
 | ||||||
|  | -        if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI)))
 | ||||||
|  | -            xmlFree((char *) entity->URI);
 | ||||||
|  | -        if ((entity->content != NULL)
 | ||||||
|  | -            && (!xmlDictOwns(dict, entity->content)))
 | ||||||
|  | -            xmlFree((char *) entity->content);
 | ||||||
|  | -        if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig)))
 | ||||||
|  | -            xmlFree((char *) entity->orig);
 | ||||||
|  | -    } else {
 | ||||||
|  | -        if (entity->name != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->name);
 | ||||||
|  | -        if (entity->ExternalID != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->ExternalID);
 | ||||||
|  | -        if (entity->SystemID != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->SystemID);
 | ||||||
|  | -        if (entity->URI != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->URI);
 | ||||||
|  | -        if (entity->content != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->content);
 | ||||||
|  | -        if (entity->orig != NULL)
 | ||||||
|  | -            xmlFree((char *) entity->orig);
 | ||||||
|  | -    }
 | ||||||
|  | +    if ((entity->name != NULL) &&
 | ||||||
|  | +        ((dict == NULL) || (!xmlDictOwns(dict, entity->name))))
 | ||||||
|  | +        xmlFree((char *) entity->name);
 | ||||||
|  | +    if (entity->ExternalID != NULL)
 | ||||||
|  | +        xmlFree((char *) entity->ExternalID);
 | ||||||
|  | +    if (entity->SystemID != NULL)
 | ||||||
|  | +        xmlFree((char *) entity->SystemID);
 | ||||||
|  | +    if (entity->URI != NULL)
 | ||||||
|  | +        xmlFree((char *) entity->URI);
 | ||||||
|  | +    if (entity->content != NULL)
 | ||||||
|  | +        xmlFree((char *) entity->content);
 | ||||||
|  | +    if (entity->orig != NULL)
 | ||||||
|  | +        xmlFree((char *) entity->orig);
 | ||||||
|  |      xmlFree(entity); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -193,18 +176,12 @@ xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type,
 | ||||||
|  |  	    ret->SystemID = xmlStrdup(SystemID); | ||||||
|  |      } else { | ||||||
|  |          ret->name = xmlDictLookup(dict, name, -1); | ||||||
|  | -	if (ExternalID != NULL)
 | ||||||
|  | -	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
 | ||||||
|  | -	if (SystemID != NULL)
 | ||||||
|  | -	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
 | ||||||
|  | +	ret->ExternalID = xmlStrdup(ExternalID);
 | ||||||
|  | +	ret->SystemID = xmlStrdup(SystemID);
 | ||||||
|  |      } | ||||||
|  |      if (content != NULL) { | ||||||
|  |          ret->length = xmlStrlen(content); | ||||||
|  | -	if ((dict != NULL) && (ret->length < 5))
 | ||||||
|  | -	    ret->content = (xmlChar *)
 | ||||||
|  | -	                   xmlDictLookup(dict, content, ret->length);
 | ||||||
|  | -	else
 | ||||||
|  | -	    ret->content = xmlStrndup(content, ret->length);
 | ||||||
|  | +	ret->content = xmlStrndup(content, ret->length);
 | ||||||
|  |       } else { | ||||||
|  |          ret->length = 0; | ||||||
|  |          ret->content = NULL; | ||||||
|  | -- 
 | ||||||
|  | GitLab | ||||||
|  | 
 | ||||||
| @ -1,6 +1,6 @@ | |||||||
| Name:           libxml2 | Name:           libxml2 | ||||||
| Version:        2.9.13 | Version:        2.9.13 | ||||||
| Release:        2%{?dist} | Release:        3%{?dist} | ||||||
| Summary:        Library providing XML and HTML support | Summary:        Library providing XML and HTML support | ||||||
| 
 | 
 | ||||||
| License:        MIT | License:        MIT | ||||||
| @ -12,6 +12,10 @@ Patch0:         libxml2-multilib.patch | |||||||
| Patch1:         libxml2-2.9.8-python3-unicode-errors.patch | Patch1:         libxml2-2.9.8-python3-unicode-errors.patch | ||||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=2082300 | # https://bugzilla.redhat.com/show_bug.cgi?id=2082300 | ||||||
| Patch2:         libxml2-2.9.13-CVE-2022-29824.patch | Patch2:         libxml2-2.9.13-CVE-2022-29824.patch | ||||||
|  | # https://bugzilla.redhat.com/show_bug.cgi?id=2136564 | ||||||
|  | Patch3:         libxml2-2.9.13-CVE-2022-40303.patch | ||||||
|  | # https://bugzilla.redhat.com/show_bug.cgi?id=2136569 | ||||||
|  | Patch4:         libxml2-2.9.13-CVE-2022-40304.patch | ||||||
| 
 | 
 | ||||||
| BuildRequires:  cmake-rpm-macros | BuildRequires:  cmake-rpm-macros | ||||||
| BuildRequires:  gcc | BuildRequires:  gcc | ||||||
| @ -140,6 +144,10 @@ gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz | |||||||
| %{python3_sitearch}/libxml2mod.so | %{python3_sitearch}/libxml2mod.so | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Nov 01 2022 David King <amigadave@amigadave.com> - 2.9.13-3 | ||||||
|  | - Fix CVE-2022-40303 (#2136564) | ||||||
|  | - Fix CVE-2022-40304 (#2136569) | ||||||
|  | 
 | ||||||
| * Tue May 10 2022 David King <amigadave@amigadave.com> - 2.9.13-2 | * Tue May 10 2022 David King <amigadave@amigadave.com> - 2.9.13-2 | ||||||
| - Fix CVE-2022-29824 (#2082300) | - Fix CVE-2022-29824 (#2082300) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user