loader: Remove unused arguments from LoadModule

Nobody was ever calling this with a non-null argument for subdir list or
pattern list.  Having done this, InitSubdirs is only ever called with a
NULL argument, so it's really just a complicated way of duplicating the
default list; we can remove that and just walk the list directly.

The minor error code was only ever used to distinguish among two cases
of LDR_BADUSAGE. Whatever.

Reviewed-by: Julien Cristau <jcristau@debian.org>
Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Adam Jackson 2016-04-14 11:45:58 -04:00
parent ba726ba6a7
commit 8920dca009
7 changed files with 21 additions and 199 deletions

View File

@ -1590,7 +1590,7 @@ xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name)
void *
xf86LoadOneModule(const char *name, void *opt)
{
int errmaj, errmin;
int errmaj;
char *Name;
void *mod;
@ -1608,9 +1608,9 @@ xf86LoadOneModule(const char *name, void *opt)
return NULL;
}
mod = LoadModule(Name, NULL, NULL, opt, NULL, &errmaj, &errmin);
mod = LoadModule(Name, opt, NULL, &errmaj);
if (!mod)
LoaderErrorMsg(NULL, Name, errmaj, errmin);
LoaderErrorMsg(NULL, Name, errmaj, 0);
free(Name);
return mod;
}

View File

@ -1473,7 +1473,7 @@ ddxUseMsg(void)
Bool
xf86LoadModules(const char **list, void **optlist)
{
int errmaj, errmin;
int errmaj;
void *opt;
int i;
char *name;
@ -1503,8 +1503,8 @@ xf86LoadModules(const char **list, void **optlist)
else
opt = NULL;
if (!LoadModule(name, NULL, NULL, opt, NULL, &errmaj, &errmin)) {
LoaderErrorMsg(NULL, name, errmaj, errmin);
if (!LoadModule(name, opt, NULL, &errmaj)) {
LoaderErrorMsg(NULL, name, errmaj, 0);
failed = TRUE;
}
free(name);

View File

@ -5210,10 +5210,8 @@ XFree86 common layer.
<blockquote><para>
<programlisting>
pointer LoadModule(const char *module,
const char **subdirlist, const char **patternlist,
pointer options, const XF86ModReqInfo * modreq,
int *errmaj, int *errmin);
pointer LoadModule(const char *module, pointer options,
const XF86ModReqInfo * modreq, int *errmaj);
</programlisting>
<blockquote><para>
The <function>LoadModule()</function> function loads the module called
@ -5227,42 +5225,6 @@ XFree86 common layer.
<variablelist>
<varlistentry>
<term><parameter>subdirlist</parameter></term>
<listitem><para>
An optional <constant>NULL</constant> terminated list of
subdirectories to search. When <constant>NULL</constant>,
the default built-in list is used (refer to
<varname>stdSubdirs</varname> in <filename>loadmod.c</filename>).
The default list is also substituted for entries in
<parameter>subdirlist</parameter> with the value
<constant>DEFAULT_LIST</constant>. This makes is possible
to augment the default list instead of replacing it.
Subdir elements must be relative, and must not contain
<literal remap="tt">".."</literal>. If any violate this requirement,
the load fails.
</para></listitem></varlistentry>
<varlistentry>
<term><parameter>patternlist</parameter></term>
<listitem><para>
An optional <constant>NULL</constant> terminated list of
POSIX regular expressions used to connect module
filenames with canonical module names. Each regex
should contain exactly one subexpression that corresponds
to the canonical module name. When <constant>NULL</constant>,
the default built-in list is used (refer to
<varname>stdPatterns</varname> in
<filename>loadmod.c</filename>). The default list is also
substituted for entries in <parameter>patternlist</parameter>
with the value <constant>DEFAULT_LIST</constant>. This
makes it possible to augment the default list instead
of replacing it.
</para></listitem></varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem><para>
@ -5371,13 +5333,6 @@ typedef struct {
<function>LoadModule()</function> fails.
</para></listitem></varlistentry>
<varlistentry>
<term><parameter>errmin</parameter></term>
<listitem><para>
Like <parameter>errmaj</parameter>, but for the minor part
of the error code.
</para></listitem></varlistentry>
</variablelist>
</para></blockquote>

View File

@ -89,7 +89,7 @@ LoaderInit(void)
/* Public Interface to the loader. */
void *
LoaderOpen(const char *module, int *errmaj, int *errmin)
LoaderOpen(const char *module, int *errmaj)
{
void *ret;
@ -103,8 +103,6 @@ LoaderOpen(const char *module, int *errmaj, int *errmin)
LogMessage(X_ERROR, "Failed to load %s: %s\n", module, dlerror());
if (errmaj)
*errmaj = LDR_NOLOAD;
if (errmin)
*errmin = LDR_NOLOAD;
return NULL;
}

View File

@ -71,7 +71,7 @@ extern const ModuleVersions LoaderVersionInfo;
extern unsigned long LoaderOptions;
/* Internal Functions */
void *LoaderOpen(const char *, int *, int *);
void *LoaderOpen(const char *, int *);
void *LoaderSymbolFromModule(void *, const char *);
#endif /* _LOADER_H */

View File

@ -72,9 +72,7 @@ typedef struct module_desc {
void LoaderInit(void);
ModuleDescPtr LoadModule(const char *, const char **,
const char **, void *, const XF86ModReqInfo *,
int *, int *);
ModuleDescPtr LoadModule(const char *, void *, const XF86ModReqInfo *, int *);
ModuleDescPtr DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent);
void UnloadDriver(ModuleDescPtr);
void LoaderSetPath(const char *path);

View File

@ -67,7 +67,7 @@ typedef struct _pattern {
} PatternRec, *PatternPtr;
/* Prototypes for static functions */
static char *FindModule(const char *, const char *, const char **, PatternPtr);
static char *FindModule(const char *, const char *, PatternPtr);
static Bool CheckVersion(const char *, XF86ModuleVersionInfo *,
const XF86ModReqInfo *);
static char *LoaderGetCanonicalName(const char *, PatternPtr);
@ -261,99 +261,6 @@ FreePatterns(PatternPtr patterns)
free(patterns);
}
static const char **
InitSubdirs(const char **subdirlist)
{
int i;
const char **tmp_subdirlist = NULL;
char **subdirs = NULL;
const char **s, **stmp = NULL;
int len;
Bool indefault;
if (subdirlist == NULL) {
subdirlist = tmp_subdirlist = malloc(2 * sizeof(char *));
if (subdirlist == NULL)
return NULL;
subdirlist[0] = DEFAULT_LIST;
subdirlist[1] = NULL;
}
{
/* Count number of entries and check for invalid paths */
for (i = 0, s = subdirlist; *s; i++, s++) {
if (*s == DEFAULT_LIST) {
i += sizeof(stdSubdirs) / sizeof(stdSubdirs[0]) - 1 - 1;
}
else {
/*
* Path validity check. Don't allow absolute paths, or
* paths containing "..". To catch absolute paths on
* platforms that use driver letters, don't allow the ':'
* character to appear at all.
*/
if (**s == '/' || **s == '\\' || strchr(*s, ':') ||
strstr(*s, "..")) {
LogMessage(X_ERROR, "InitSubdirs: Bad subdir \"%s\"\n", *s);
free(tmp_subdirlist);
return NULL;
}
}
}
subdirs = xallocarray(i * 2 + 1, sizeof(char *));
if (!subdirs) {
free(tmp_subdirlist);
return NULL;
}
i = 0;
s = subdirlist;
indefault = FALSE;
while (*s) {
if (*s == DEFAULT_LIST) {
/* Divert to the default list */
indefault = TRUE;
stmp = ++s;
s = stdSubdirs;
}
len = strlen(*s);
if (**s && (*s)[len - 1] != '/') {
len++;
}
if (!(subdirs[i] = malloc(len))) {
while (--i >= 0)
free(subdirs[i]);
free(subdirs);
free(tmp_subdirlist);
return NULL;
}
/* path as given */
subdirs[i] = strdup(*s);
i++;
s++;
if (indefault && !s) {
/* revert back to the main list */
indefault = FALSE;
s = stmp;
}
}
subdirs[i] = NULL;
}
free(tmp_subdirlist);
return (const char **) subdirs;
}
static void
FreeSubdirs(const char **subdirs)
{
const char **s;
if (subdirs) {
for (s = subdirs; *s; s++)
free((char *) *s);
free(subdirs);
}
}
static char *
FindModuleInSubdir(const char *dirpath, const char *module)
{
@ -418,22 +325,16 @@ FindModuleInSubdir(const char *dirpath, const char *module)
}
static char *
FindModule(const char *module, const char *dirname, const char **subdirlist,
PatternPtr patterns)
FindModule(const char *module, const char *dirname, PatternPtr patterns)
{
char buf[PATH_MAX + 1];
char *name = NULL;
const char **subdirs = NULL;
const char **s;
if (strlen(dirname) > PATH_MAX)
return NULL;
subdirs = InitSubdirs(subdirlist);
if (!subdirs)
return NULL;
for (s = subdirs; *s; s++) {
for (s = stdSubdirs; *s; s++) {
if ((strlen(dirname) + strlen(*s)) > PATH_MAX)
continue;
strcpy(buf, dirname);
@ -442,8 +343,6 @@ FindModule(const char *module, const char *dirname, const char **subdirlist,
break;
}
FreeSubdirs(subdirs);
return name;
}
@ -693,8 +592,7 @@ LoadSubModule(void *_parent, const char *module,
return NULL;
}
submod = LoadModule(module, subdirlist, patternlist, options,
modreq, errmaj, errmin);
submod = LoadModule(module, options, modreq, errmaj);
if (submod && submod != (ModuleDescPtr) 1) {
parent->child = AddSibling(parent->child, submod);
submod->parent = parent;
@ -763,15 +661,6 @@ static const char *compiled_in_modules[] = {
* module The module name. Normally this is not a filename but the
* module's "canonical name. A full pathname is, however,
* also accepted.
* subdirlist A NULL terminated list of subdirectories to search. When
* NULL, the default "stdSubdirs" list is used. The default
* list is also substituted for entries with value DEFAULT_LIST.
* patternlist A NULL terminated list of regular expressions used to find
* module filenames. Each regex should contain exactly one
* subexpression that corresponds to the canonical module name.
* When NULL, the default "stdPatterns" list is used. The
* default list is also substituted for entries with value
* DEFAULT_LIST.
* options A NULL terminated list of Options that are passed to the
* module's SetupProc function.
* modreq An optional XF86ModReqInfo* containing
@ -790,13 +679,11 @@ static const char *compiled_in_modules[] = {
* string
* "don't care" values are ~0 for numbers, and NULL for strings
* errmaj Major error return.
* errmin Minor error return.
*
*/
ModuleDescPtr
LoadModule(const char *module, const char **subdirlist,
const char **patternlist, void *options,
const XF86ModReqInfo * modreq, int *errmaj, int *errmin)
LoadModule(const char *module, void *options, const XF86ModReqInfo *modreq,
int *errmaj)
{
XF86ModuleData *initdata = NULL;
char **pathlist = NULL;
@ -812,7 +699,7 @@ LoadModule(const char *module, const char **subdirlist,
LogMessageVerb(X_INFO, 3, "LoadModule: \"%s\"", module);
patterns = InitPatterns(patternlist);
patterns = InitPatterns(NULL);
name = LoaderGetCanonicalName(module, patterns);
noncanonical = (name && strcmp(module, name) != 0);
if (noncanonical) {
@ -837,16 +724,12 @@ LoadModule(const char *module, const char **subdirlist,
if (!name) {
if (errmaj)
*errmaj = LDR_BADUSAGE;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
ret = NewModuleDesc(name);
if (!ret) {
if (errmaj)
*errmaj = LDR_NOMEM;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
@ -855,8 +738,6 @@ LoadModule(const char *module, const char **subdirlist,
/* This could be a malloc failure too */
if (errmaj)
*errmaj = LDR_BADUSAGE;
if (errmin)
*errmin = 1;
goto LoadModule_fail;
}
@ -868,7 +749,7 @@ LoadModule(const char *module, const char **subdirlist,
found = xstrdup(module);
path_elem = pathlist;
while (!found && *path_elem != NULL) {
found = FindModule(m, *path_elem, subdirlist, patterns);
found = FindModule(m, *path_elem, patterns);
path_elem++;
/*
* When the module name isn't the canonical name, search for the
@ -887,11 +768,9 @@ LoadModule(const char *module, const char **subdirlist,
LogMessage(X_WARNING, "Warning, couldn't open module %s\n", module);
if (errmaj)
*errmaj = LDR_NOENT;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
ret->handle = LoaderOpen(found, errmaj, errmin);
ret->handle = LoaderOpen(found, errmaj);
if (ret->handle == NULL)
goto LoadModule_fail;
ret->path = strdup(found);
@ -909,8 +788,6 @@ LoadModule(const char *module, const char **subdirlist,
p = NULL;
if (errmaj)
*errmaj = LDR_NOMEM;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
initdata = LoaderSymbolFromModule(ret->handle, p);
@ -927,8 +804,6 @@ LoadModule(const char *module, const char **subdirlist,
if (!CheckVersion(module, vers, modreq)) {
if (errmaj)
*errmaj = LDR_MISMATCH;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
}
@ -937,8 +812,6 @@ LoadModule(const char *module, const char **subdirlist,
" version information\n", module);
if (errmaj)
*errmaj = LDR_INVALID;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
if (setup)
@ -953,12 +826,10 @@ LoadModule(const char *module, const char **subdirlist,
"data object.\n", module, p);
if (errmaj)
*errmaj = LDR_INVALID;
if (errmin)
*errmin = 0;
goto LoadModule_fail;
}
if (ret->SetupProc) {
ret->TearDownData = ret->SetupProc(ret, options, errmaj, errmin);
ret->TearDownData = ret->SetupProc(ret, options, errmaj, NULL);
if (!ret->TearDownData) {
goto LoadModule_fail;
}