Skip to content

Commit

Permalink
module: support reading multiple values per modinfo tag
Browse files Browse the repository at this point in the history
Similar to modpost's get_next_modinfo(), introduce get_next_modinfo() in
kernel/module.c to acquire any further values associated with the same
modinfo tag name. That is useful for any tags that have multiple
occurrences (such as 'alias'), but is in particular introduced here as
part of the symbol namespaces patch series to read the (potentially)
multiple namespaces a module is importing.

Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Reviewed-by: Martijn Coenen <maco@android.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
  • Loading branch information
Matthias Maennich authored and Jessica Yu committed Sep 10, 2019
1 parent 089cf7f commit c5e4a06
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -2481,7 +2481,8 @@ static char *next_string(char *string, unsigned long *secsize)
return string;
}

static char *get_modinfo(struct load_info *info, const char *tag)
static char *get_next_modinfo(const struct load_info *info, const char *tag,
char *prev)
{
char *p;
unsigned int taglen = strlen(tag);
Expand All @@ -2492,13 +2493,25 @@ static char *get_modinfo(struct load_info *info, const char *tag)
* get_modinfo() calls made before rewrite_section_headers()
* must use sh_offset, as sh_addr isn't set!
*/
for (p = (char *)info->hdr + infosec->sh_offset; p; p = next_string(p, &size)) {
char *modinfo = (char *)info->hdr + infosec->sh_offset;

if (prev) {
size -= prev - modinfo;
modinfo = next_string(prev, &size);
}

for (p = modinfo; p; p = next_string(p, &size)) {
if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
return p + taglen + 1;
}
return NULL;
}

static char *get_modinfo(const struct load_info *info, const char *tag)
{
return get_next_modinfo(info, tag, NULL);
}

static void setup_modinfo(struct module *mod, struct load_info *info)
{
struct module_attribute *attr;
Expand Down

0 comments on commit c5e4a06

Please sign in to comment.