Thread (14 messages) 14 messages, 5 authors, 2024-10-21

Re: [PATCH v5 14/16] modules: Support extended MODVERSIONS info

From: Sami Tolvanen <samitolvanen@google.com>
Date: 2024-09-26 18:37:31
Also in: asahi, linux-kbuild, linux-modules, lkml, rust-for-linux

On Thu, Sep 26, 2024 at 5:22 AM Christophe Leroy
[off-list ref] wrote:


Le 26/09/2024 à 01:38, Matthew Maurer a écrit :
quoted
Adds a new format for MODVERSIONS which stores each field in a separate
ELF section. This initially adds support for variable length names, but
could later be used to add additional fields to MODVERSIONS in a
backwards compatible way if needed. Any new fields will be ignored by
old user tooling, unlike the current format where user tooling cannot
tolerate adjustments to the format (for example making the name field
longer).

Since PPC munges its version records to strip leading dots, we reproduce
the munging for the new format. Other architectures do not appear to
have architecture-specific usage of this information.

Signed-off-by: Matthew Maurer <redacted>
---
  arch/powerpc/kernel/module_64.c | 23 ++++++++-
  kernel/module/internal.h        | 11 ++++
  kernel/module/main.c            | 92 ++++++++++++++++++++++++++++++---
  kernel/module/version.c         | 45 ++++++++++++++++
  4 files changed, 161 insertions(+), 10 deletions(-)
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index e9bab599d0c2..4e7b156dd8b2 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -355,6 +355,23 @@ static void dedotify_versions(struct modversion_info *vers,
              }
  }

+static void dedotify_ext_version_names(char *str_seq, unsigned long size)
+{
+     unsigned long out = 0;
+     unsigned long in;
+     char last = '\0';
+
+     for (in = 0; in < size; in++) {
+             /* Skip one leading dot */
+             if (last == '\0' && str_seq[in] == '.')
+                     in++;
+             last = str_seq[in];
+             str_seq[out++] = last;
+     }
Why do you need a loop here ?

Can't you just do something like:

        if (str_seq[0] == '.')
                memmove(str_seq, str_seq + 1, size);
I initially had the same thought, but it's because this is is a
sequence of multiple null-terminated strings, and we need to dedotify
all of them, not just the first one. Here's an example:

https://godbolt.org/z/avMGnd48M
quoted
+     /* Zero the trailing portion of the names table for robustness */
+     memset(&str_seq[out], 0, size - out);
This seems unneeded.
Strictly speaking it shouldn't be needed, but I think it's still good
hygiene to not leave another null-terminated fragment at the end.

Sami
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help