dix: AddExtension: simplify error return path
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
9149af91d2
commit
d536bd7f66
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue