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) {
|
xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int tofree = 0;
|
int tofree = 0;
|
||||||
|
int i, handler_in_list = 0;
|
||||||
|
|
||||||
if (handler == NULL) return(-1);
|
if (handler == NULL) return(-1);
|
||||||
if (handler->name == 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
|
#ifdef LIBXML_ICONV_ENABLED
|
||||||
/*
|
/*
|
||||||
* Iconv handlers can be used only once, free the whole block.
|
* Iconv handlers can be used only once, free the whole block.
|
||||||
* and the associated icon resources.
|
* 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;
|
tofree = 1;
|
||||||
if (handler->iconv_out != NULL) {
|
if (handler->iconv_out != NULL) {
|
||||||
if (iconv_close(handler->iconv_out))
|
if (iconv_close(handler->iconv_out))
|
||||||
@@ -2875,7 +2886,8 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) {
|
|||||||
}
|
}
|
||||||
#endif /* LIBXML_ICONV_ENABLED */
|
#endif /* LIBXML_ICONV_ENABLED */
|
||||||
#ifdef LIBXML_ICU_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;
|
tofree = 1;
|
||||||
if (handler->uconv_out != NULL) {
|
if (handler->uconv_out != NULL) {
|
||||||
closeIcuConverter(handler->uconv_out);
|
closeIcuConverter(handler->uconv_out);
|
||||||
|
|||||||
Reference in New Issue
Block a user