From 49faf3ca53c43447b91e67354df48e43099c23f3 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 25 Mar 2025 14:58:55 +0100 Subject: [PATCH] (!1880) dix: simplify extension query Signed-off-by: Enrico Weigelt, metux IT consult --- dix/extension.c | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/dix/extension.c b/dix/extension.c index fd1439957..fe26d9ce3 100644 --- a/dix/extension.c +++ b/dix/extension.c @@ -142,19 +142,6 @@ AddExtension(const char *name, int NumEvents, int NumErrors, return ext; } -static int -FindExtension(const char *extname, int len) -{ - int i; - - for (i = 0; i < NumExtensions; i++) { - if ((strlen(extensions[i]->name) == len) && - !strncmp(extname, extensions[i]->name, len)) - break; - } - return ((i == NumExtensions) ? -1 : i); -} - /* * CheckExtension returns the extensions[] entry for the requested * extension name. Maybe this could just return a Bool instead? @@ -162,13 +149,13 @@ FindExtension(const char *extname, int len) ExtensionEntry * CheckExtension(const char *extname) { - int n; - - n = FindExtension(extname, strlen(extname)); - if (n != -1) - return extensions[n]; - else - return NULL; + for (int i = 0; i < NumExtensions; i++) { + if (extensions[i] && + extensions[i]->name && + strcmp(extensions[i]->name, extname) == 0) + return extensions[i]; + } + return NULL; } /* @@ -224,7 +211,6 @@ int ProcQueryExtension(ClientPtr client) { xQueryExtensionReply reply; - int i; REQUEST(xQueryExtensionReq); @@ -240,14 +226,17 @@ ProcQueryExtension(ClientPtr client) if (!NumExtensions) reply.present = xFalse; else { - i = FindExtension((char *) &stuff[1], stuff->nbytes); - if (i < 0 || !ExtensionAvailable(client, extensions[i])) + char extname[PATH_MAX] = { 0 }; + strncpy(extname, (char *) &stuff[1], min(stuff->nbytes, sizeof(extname)-1)); + ExtensionEntry *extEntry = CheckExtension(extname); + + if (!extEntry || !ExtensionAvailable(client, extEntry)) reply.present = xFalse; else { reply.present = xTrue; - reply.major_opcode = extensions[i]->base; - reply.first_event = extensions[i]->eventBase; - reply.first_error = extensions[i]->errorBase; + reply.major_opcode = extEntry->base; + reply.first_event = extEntry->eventBase; + reply.first_error = extEntry->errorBase; } } WriteReplyToClient(client, sizeof(xQueryExtensionReply), &reply);