From db21cd5db9c8f0fdb041febc66aef889375aae32 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Tue, 6 Jun 2023 14:25:30 +0200 Subject: [PATCH] malloc-fail: Handle malloc failures in xmlAddEncodingAlias Avoid memory errors if an allocation fails. See #344. Fixes #553. Reference:https://github.com/GNOME/libxml2/commit/db21cd5db9c8f0fdb041febc66aef889375aae32 Conflict:NA --- encoding.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/encoding.c b/encoding.c index 9a7a611..c84e71c 100644 --- a/encoding.c +++ b/encoding.c @@ -1068,6 +1068,7 @@ int xmlAddEncodingAlias(const char *name, const char *alias) { int i; char upper[100]; + char *nameCopy, *aliasCopy; if ((name == NULL) || (alias == NULL)) return(-1); @@ -1078,19 +1079,21 @@ xmlAddEncodingAlias(const char *name, const char *alias) { } upper[i] = 0; - if (xmlCharEncodingAliases == NULL) { - xmlCharEncodingAliasesNb = 0; - xmlCharEncodingAliasesMax = 20; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) - xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); - if (xmlCharEncodingAliases == NULL) - return(-1); - } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { - xmlCharEncodingAliasesMax *= 2; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) - xmlRealloc(xmlCharEncodingAliases, - xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); + if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { + xmlCharEncodingAliasPtr tmp; + size_t newSize = xmlCharEncodingAliasesMax ? + xmlCharEncodingAliasesMax * 2 : + 20; + + tmp = (xmlCharEncodingAliasPtr) + xmlRealloc(xmlCharEncodingAliases, + newSize * sizeof(xmlCharEncodingAlias)); + if (tmp == NULL) + return(-1); + xmlCharEncodingAliases = tmp; + xmlCharEncodingAliasesMax = newSize; } + /* * Walk down the list looking for a definition of the alias */ @@ -1099,16 +1102,27 @@ xmlAddEncodingAlias(const char *name, const char *alias) { /* * Replace the definition. */ + nameCopy = xmlMemStrdup(name); + if (nameCopy == NULL) + return(-1); xmlFree((char *) xmlCharEncodingAliases[i].name); - xmlCharEncodingAliases[i].name = xmlMemStrdup(name); + xmlCharEncodingAliases[i].name = nameCopy; return(0); } } /* * Add the definition */ - xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name); - xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper); + nameCopy = xmlMemStrdup(name); + if (nameCopy == NULL) + return(-1); + aliasCopy = xmlMemStrdup(upper); + if (aliasCopy == NULL) { + xmlFree(nameCopy); + return(-1); + } + xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = nameCopy; + xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = aliasCopy; xmlCharEncodingAliasesNb++; return(0); } -- 2.33.0