From: Peter Zijlstra <peterz@infradead.org>
To: mcgrof@kernel.org
Cc: x86@kernel.org, hpa@zytor.com, petr.pavlu@suse.com,
samitolvanen@google.com, da.gomez@samsung.com,
masahiroy@kernel.org, nathan@kernel.org, nicolas@fjasle.eu,
linux-kernel@vger.kernel.org, linux-modules@vger.kernel.org,
linux-kbuild@vger.kernel.org, hch@infradead.org,
gregkh@linuxfoundation.org,
"Peter Zijlstra (Intel)" <peterz@infradead.org>
Subject: [RFC][PATCH 7/8] module: Extend the MODULE_ namespace parsing
Date: Mon, 11 Nov 2024 11:54:37 +0100 [thread overview]
Message-ID: <20241111111817.679388337@infradead.org> (raw)
In-Reply-To: 20241111105430.575636482@infradead.org
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 (Intel) <peterz@infradead.org>
---
kernel/module/main.c | 39 ++++++++++++++++++++++++++++++++++-----
scripts/mod/modpost.c | 40 ++++++++++++++++++++++++++++++++++------
2 files changed, 68 insertions(+), 11 deletions(-)
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -1061,6 +1061,38 @@ static char *get_modinfo(const struct lo
return get_next_modinfo(info, tag, NULL);
}
+/*
+ * @namespace ~= "MODULE_foo-*,bar", match @modname to 'foo-*' or 'bar'
+ */
+static bool verify_module_namespace(const char *namespace, const char *modname)
+{
+ size_t len, modlen = strlen(modname);
+ const char *sep;
+ bool glob;
+
+ if (strncmp(namespace, "MODULE_", 7) != 0)
+ return false;
+
+ for (namespace += 7; *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,
const struct kernel_symbol *sym,
struct module *mod)
@@ -1070,11 +1102,8 @@ static int verify_namespace_is_imported(
namespace = kernel_symbol_namespace(sym);
if (namespace && namespace[0]) {
- /*
- * Implicitly import MODULE_${mod->name} namespace.
- */
- if (strncmp(namespace, "MODULE_", 7) == 0 &&
- strcmp(namespace+7, mod->name) == 0)
+
+ if (verify_module_namespace(namespace, mod->name))
return 0;
for_each_modinfo_entry(imported_namespace, info, "import_ns") {
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1565,7 +1565,6 @@ static const char *mod_basename(const ch
static void read_symbols(const char *modname)
{
- char module_namespace[MODULE_NAME_LEN + 8];
const char *symname;
char *version;
char *license;
@@ -1601,10 +1600,6 @@ static void read_symbols(const char *mod
namespace = get_next_modinfo(&info, "import_ns", namespace))
add_namespace(&mod->imported_namespaces, namespace);
- snprintf(module_namespace, sizeof(module_namespace), "MODULE_%s",
- mod_basename(mod->name));
- add_namespace(&mod->imported_namespaces, module_namespace);
-
if (extra_warn && !get_modinfo(&info, "description"))
warn("missing MODULE_DESCRIPTION() in %s\n", modname);
}
@@ -1687,6 +1682,38 @@ void buf_write(struct buffer *buf, const
buf->pos += len;
}
+/*
+ * @namespace ~= "MODULE_foo-*,bar", match @modname to 'foo-*' or 'bar'
+ */
+static bool module_namespace(const char *namespace, const char *modname)
+{
+ size_t len, modlen = strlen(modname);
+ const char *sep;
+ bool glob;
+
+ if (strncmp(namespace, "MODULE_", 7) != 0)
+ return false;
+
+ for (namespace += 7; *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)
{
struct symbol *s, *exp;
@@ -1714,7 +1741,8 @@ static void check_exports(struct module
basename = mod_basename(mod->name);
- if (!contains_namespace(&mod->imported_namespaces, exp->namespace)) {
+ if (!module_namespace(exp->namespace, basename) &&
+ !contains_namespace(&mod->imported_namespaces, exp->namespace)) {
modpost_log(!allow_missing_ns_imports,
"module %s uses symbol %s from namespace %s, but does not import it.\n",
basename, exp->name, exp->namespace);
next prev parent reply other threads:[~2024-11-11 11:19 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-11 10:54 [RFC][PATCH 0/8] module: Strict per-modname namespaces Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 1/8] module: Prepare for script Peter Zijlstra
2024-11-11 11:36 ` Christoph Hellwig
2024-11-11 12:55 ` Peter Zijlstra
2024-11-15 11:49 ` Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 2/8] module: Convert symbol namespace to string literal Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 3/8] module: Fix up after script Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 4/8] module/modpost: Use for() loop Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 5/8] module/modpost: Add basename helper Peter Zijlstra
2024-11-11 10:54 ` [RFC][PATCH 6/8] module: Add module specific symbol namespace support Peter Zijlstra
2024-11-11 11:37 ` Christoph Hellwig
2024-11-11 18:36 ` Sean Christopherson
2024-11-12 9:18 ` Peter Zijlstra
2024-11-11 10:54 ` Peter Zijlstra [this message]
2024-11-11 10:54 ` [RFC][PATCH 8/8] module: Provide EXPORT_SYMBOL*_FOR() helpers Peter Zijlstra
2024-11-11 11:37 ` Christoph Hellwig
2024-11-12 0:48 ` [RFC][PATCH 0/8] module: Strict per-modname namespaces Sean Christopherson
2024-11-12 9:20 ` Peter Zijlstra
2024-11-12 17:56 ` Sean Christopherson
2024-11-12 19:52 ` Peter Zijlstra
2024-11-15 12:49 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241111111817.679388337@infradead.org \
--to=peterz@infradead.org \
--cc=da.gomez@samsung.com \
--cc=gregkh@linuxfoundation.org \
--cc=hch@infradead.org \
--cc=hpa@zytor.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-modules@vger.kernel.org \
--cc=masahiroy@kernel.org \
--cc=mcgrof@kernel.org \
--cc=nathan@kernel.org \
--cc=nicolas@fjasle.eu \
--cc=petr.pavlu@suse.com \
--cc=samitolvanen@google.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.