mirror of
				https://gitlab.gnome.org/GNOME/libxml2.git
				synced 2025-10-24 13:33:01 +03:00 
			
		
		
		
	Avoid a possibility of dangling encoding handler
For https://bugzilla.gnome.org/show_bug.cgi?id=711149 In Function: int xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) If the freed handler is any one of handlers[i] list, then it will make that hanldlers[i] as dangling. This may lead to crash issues at places where handlers is read.
This commit is contained in:
		
							
								
								
									
										16
									
								
								encoding.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								encoding.c
									
									
									
									
									
								
							| @@ -2853,14 +2853,25 @@ int | ||||
| xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { | ||||
|     int ret = 0; | ||||
|     int tofree = 0; | ||||
|     int i, handler_in_list = 0; | ||||
|  | ||||
|     if (handler == NULL) return(-1); | ||||
|     if (handler->name == NULL) return(-1); | ||||
|     if (handlers != NULL) { | ||||
|         for (i = 0;i < nbCharEncodingHandler; i++) { | ||||
|             if (handler == handlers[i]) { | ||||
| 	        handler_in_list = 1; | ||||
| 		break; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| #ifdef LIBXML_ICONV_ENABLED | ||||
|     /* | ||||
|      * Iconv handlers can be used only once, free the whole block. | ||||
|      * and the associated icon resources. | ||||
|      */ | ||||
|     if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { | ||||
|     if ((handler_in_list == 0) && | ||||
|         ((handler->iconv_out != NULL) || (handler->iconv_in != NULL))) { | ||||
|         tofree = 1; | ||||
| 	if (handler->iconv_out != NULL) { | ||||
| 	    if (iconv_close(handler->iconv_out)) | ||||
| @@ -2875,7 +2886,8 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { | ||||
|     } | ||||
| #endif /* LIBXML_ICONV_ENABLED */ | ||||
| #ifdef LIBXML_ICU_ENABLED | ||||
|     if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) { | ||||
|     if ((handler_in_list == 0) && | ||||
|         ((handler->uconv_out != NULL) || (handler->uconv_in != NULL))) { | ||||
|         tofree = 1; | ||||
| 	if (handler->uconv_out != NULL) { | ||||
| 	    closeIcuConverter(handler->uconv_out); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user