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