mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-03-28 22:50:07 +03:00
malloc-fail: Handle malloc failures in xmlAddEncodingAlias
Avoid memory errors if an allocation fails. See #344. Fixes #553.
This commit is contained in:
parent
305a75ccbe
commit
db21cd5db9
44
encoding.c
44
encoding.c
@ -1052,6 +1052,7 @@ int
|
||||
xmlAddEncodingAlias(const char *name, const char *alias) {
|
||||
int i;
|
||||
char upper[100];
|
||||
char *nameCopy, *aliasCopy;
|
||||
|
||||
if ((name == NULL) || (alias == NULL))
|
||||
return(-1);
|
||||
@ -1062,19 +1063,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
|
||||
*/
|
||||
@ -1083,16 +1086,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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user