mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
module: Extend the module namespace parsing
Instead of only accepting "module:${name}", extend it with a comma
separated list of module names and add tail glob support.
That is, something like: "module:foo-*,bar" is now possible.
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
committed by
Masahiro Yamada
parent
520b1a147d
commit
754f8733fc
@@ -1083,12 +1083,44 @@ static char *get_modinfo(const struct load_info *info, const char *tag)
|
||||
return get_next_modinfo(info, tag, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* verify_module_namespace() - does @modname have access to this symbol's @namespace
|
||||
* @namespace: export symbol namespace
|
||||
* @modname: module name
|
||||
*
|
||||
* If @namespace is prefixed with "module:" to indicate it is a module namespace
|
||||
* then test if @modname matches any of the comma separated patterns.
|
||||
*
|
||||
* The patterns only support tail-glob.
|
||||
*/
|
||||
static bool verify_module_namespace(const char *namespace, const char *modname)
|
||||
{
|
||||
size_t len, modlen = strlen(modname);
|
||||
const char *prefix = "module:";
|
||||
const char *sep;
|
||||
bool glob;
|
||||
|
||||
return strstarts(namespace, prefix) &&
|
||||
!strcmp(namespace + strlen(prefix), modname);
|
||||
if (!strstarts(namespace, prefix))
|
||||
return false;
|
||||
|
||||
for (namespace += strlen(prefix); *namespace; namespace = sep) {
|
||||
sep = strchrnul(namespace, ',');
|
||||
len = sep - namespace;
|
||||
|
||||
glob = false;
|
||||
if (sep[-1] == '*') {
|
||||
len--;
|
||||
glob = true;
|
||||
}
|
||||
|
||||
if (*sep)
|
||||
sep++;
|
||||
|
||||
if (strncmp(namespace, modname, len) == 0 && (glob || len == modlen))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int verify_namespace_is_imported(const struct load_info *info,
|
||||
|
||||
@@ -1682,12 +1682,44 @@ void buf_write(struct buffer *buf, const char *s, int len)
|
||||
buf->pos += len;
|
||||
}
|
||||
|
||||
/**
|
||||
* verify_module_namespace() - does @modname have access to this symbol's @namespace
|
||||
* @namespace: export symbol namespace
|
||||
* @modname: module name
|
||||
*
|
||||
* If @namespace is prefixed with "module:" to indicate it is a module namespace
|
||||
* then test if @modname matches any of the comma separated patterns.
|
||||
*
|
||||
* The patterns only support tail-glob.
|
||||
*/
|
||||
static bool verify_module_namespace(const char *namespace, const char *modname)
|
||||
{
|
||||
size_t len, modlen = strlen(modname);
|
||||
const char *prefix = "module:";
|
||||
const char *sep;
|
||||
bool glob;
|
||||
|
||||
return strstarts(namespace, prefix) &&
|
||||
!strcmp(namespace + strlen(prefix), modname);
|
||||
if (!strstarts(namespace, prefix))
|
||||
return false;
|
||||
|
||||
for (namespace += strlen(prefix); *namespace; namespace = sep) {
|
||||
sep = strchrnul(namespace, ',');
|
||||
len = sep - namespace;
|
||||
|
||||
glob = false;
|
||||
if (sep[-1] == '*') {
|
||||
len--;
|
||||
glob = true;
|
||||
}
|
||||
|
||||
if (*sep)
|
||||
sep++;
|
||||
|
||||
if (strncmp(namespace, modname, len) == 0 && (glob || len == modlen))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void check_exports(struct module *mod)
|
||||
|
||||
Reference in New Issue
Block a user