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:
Peter Zijlstra
2025-05-02 16:12:07 +02:00
committed by Masahiro Yamada
parent 520b1a147d
commit 754f8733fc
2 changed files with 68 additions and 4 deletions

View File

@@ -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,

View File

@@ -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)