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))
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue