From 3550e1e8735ddf962224ce2eb9121315d1d24bc7 Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Fri, 21 Nov 2025 16:29:01 +0200 Subject: [PATCH] xfree86/{loader,common}: Search all module directory prefixes in LoaderListDir Fixes: https://github.com/X11Libre/xserver/pull/773/commits/01c0b7fd3809902e7afa4258d8d7d81c64683996 Signed-off-by: stefan11111 --- hw/xfree86/common/xf86Configure.c | 2 +- hw/xfree86/loader/loadmod.c | 45 +++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c index 4ec41297d..5d716acae 100644 --- a/hw/xfree86/common/xf86Configure.c +++ b/hw/xfree86/common/xf86Configure.c @@ -593,7 +593,7 @@ GenerateDriverList(void) { const char **ret; static const char *patlist[] = { "(.*)_drv\\.so", NULL }; - ret = LoaderListDir(XORG_MODULE_ABI_TAG "/drivers", patlist); + ret = LoaderListDir("drivers", patlist); /* fix up the probe order for video drivers */ if (ret != NULL) diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c index 1d1bc9c04..a0330b535 100644 --- a/hw/xfree86/loader/loadmod.c +++ b/hw/xfree86/loader/loadmod.c @@ -415,8 +415,8 @@ FindModule(const char *module, const char *dirname, PatternPtr patterns) return name; } -const char ** -LoaderListDir(const char *subdir, const char **patternlist) +static const char ** +_LoaderListDir(const char *subdir, const char **patternlist, int *saved_len) { char buf[PATH_MAX + 1]; char **pathlist; @@ -490,9 +490,50 @@ LoaderListDir(const char *subdir, const char **patternlist) bail: FreePatterns(patterns); + *saved_len = ret ? n : 0; return (const char **) ret; } +const char ** +LoaderListDir(const char *subdir, const char **patternlist) +{ + int len = 0; + const char **ret = NULL; + int subdirlen = strlen(subdir); + for (int i = 0; i < sizeof(stdSubdirs) / sizeof(*stdSubdirs); i++) { + int prefixsize = sizeof(stdSubdirs[i]); + char* dir = malloc(prefixsize + subdirlen); + if (!dir) { + free(ret); + return NULL; + } + memcpy(dir, stdSubdirs[i], prefixsize - 1); + memcpy(dir + prefixsize - 1, subdir, subdirlen + 1); + + int sublen = 0; + const char **subret = _LoaderListDir(dir, patternlist, &sublen); + free(dir); + if (!subret) { + continue; + } + + int oldlen = len; + len += sublen; + void *tmp = reallocarray(ret, len + 1, sizeof(*ret)); + if (!tmp) { + free(ret); + return NULL; + } + + ret = tmp; + memcpy(ret + oldlen, subret, sublen); + } + if (ret) { + ret[len] = NULL; + } + return ret; +} + static Bool CheckVersion(const char *module, XF86ModuleVersionInfo * data, const XF86ModReqInfo * req)