dix: AddExtension: simplify error return path

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2025-03-25 15:25:55 +01:00
parent 9149af91d2
commit d536bd7f66
2 changed files with 22 additions and 18 deletions

View File

@ -76,7 +76,6 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
unsigned short (*MinorOpcodeProc) (ClientPtr c3))
{
int i;
ExtensionEntry *ext, **newexts;
if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
return ((ExtensionEntry *) NULL);
@ -87,27 +86,21 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
return ((ExtensionEntry *) NULL);
}
ext = calloc(1, sizeof(ExtensionEntry));
ExtensionEntry *ext = calloc(1, sizeof(ExtensionEntry));
if (!ext)
return NULL;
if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION)) {
free(ext);
return NULL;
}
if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION))
goto badalloc;
ext->name = strdup(name);
if (!ext->name) {
dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
free(ext);
return ((ExtensionEntry *) NULL);
}
if (!ext->name)
goto badalloc;
i = NumExtensions;
newexts = reallocarray(extensions, i + 1, sizeof(ExtensionEntry *));
if (!newexts) {
free((void *) ext->name);
dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
free(ext);
return ((ExtensionEntry *) NULL);
}
ExtensionEntry **newexts = reallocarray(extensions, i + 1, sizeof(ExtensionEntry *));
if (!newexts)
goto badalloc;
NumExtensions++;
extensions = newexts;
extensions[i] = ext;
@ -140,6 +133,14 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
RegisterExtensionNames(ext);
#endif
return ext;
badalloc:
if (ext) {
free((char*)ext->name);
dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
free(ext);
}
return NULL;
}
/*

View File

@ -541,6 +541,9 @@ _dixFreeObjectWithPrivates(void *object, PrivatePtr privates,
void
dixFreePrivates(PrivatePtr privates, DevPrivateType type)
{
if (!privates)
return;
_dixFiniPrivates(privates, type);
--global_keys[type].allocated;
free(privates);