From d536bd7f6635a46e2b24ada4383cad842b76343d Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 25 Mar 2025 15:25:55 +0100 Subject: [PATCH] dix: AddExtension: simplify error return path Signed-off-by: Enrico Weigelt, metux IT consult --- dix/extension.c | 37 +++++++++++++++++++------------------ dix/privates.c | 3 +++ 2 files changed, 22 insertions(+), 18 deletions(-) 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);