diff --git a/dix/extension.c b/dix/extension.c index 8e1a0f479..fa64429e3 100644 --- a/dix/extension.c +++ b/dix/extension.c @@ -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; } /* diff --git a/dix/privates.c b/dix/privates.c index 72cda714f..96533a217 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -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);