Contributors: 16
Author |
Tokens |
Token Proportion |
Commits |
Commit Proportion |
Aaron Tomlin |
186 |
48.19% |
4 |
12.90% |
Rusty Russell |
98 |
25.39% |
8 |
25.81% |
Kai Germaschewski |
34 |
8.81% |
2 |
6.45% |
Linus Torvalds |
16 |
4.15% |
2 |
6.45% |
Christoph Hellwig |
12 |
3.11% |
2 |
6.45% |
Peter Zijlstra |
12 |
3.11% |
1 |
3.23% |
Ard Biesheuvel |
10 |
2.59% |
1 |
3.23% |
Kees Cook |
7 |
1.81% |
2 |
6.45% |
Arjan van de Ven |
3 |
0.78% |
2 |
6.45% |
Tim Schmielau |
2 |
0.52% |
1 |
3.23% |
Masahiro Yamada |
1 |
0.26% |
1 |
3.23% |
Al Viro |
1 |
0.26% |
1 |
3.23% |
Tim Abbott |
1 |
0.26% |
1 |
3.23% |
Thomas Gleixner |
1 |
0.26% |
1 |
3.23% |
Ionut Alexa |
1 |
0.26% |
1 |
3.23% |
Jim Cromie |
1 |
0.26% |
1 |
3.23% |
Total |
386 |
|
31 |
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Module version support
*
* Copyright (C) 2008 Rusty Russell
*/
#include <linux/module.h>
#include <linux/string.h>
#include <linux/printk.h>
#include "internal.h"
int check_version(const struct load_info *info,
const char *symname,
struct module *mod,
const s32 *crc)
{
Elf_Shdr *sechdrs = info->sechdrs;
unsigned int versindex = info->index.vers;
unsigned int i, num_versions;
struct modversion_info *versions;
/* Exporting module didn't supply crcs? OK, we're already tainted. */
if (!crc)
return 1;
/* No versions at all? modprobe --force does this. */
if (versindex == 0)
return try_to_force_load(mod, symname) == 0;
versions = (void *)sechdrs[versindex].sh_addr;
num_versions = sechdrs[versindex].sh_size
/ sizeof(struct modversion_info);
for (i = 0; i < num_versions; i++) {
u32 crcval;
if (strcmp(versions[i].name, symname) != 0)
continue;
crcval = *crc;
if (versions[i].crc == crcval)
return 1;
pr_debug("Found checksum %X vs module %lX\n",
crcval, versions[i].crc);
goto bad_version;
}
/* Broken toolchain. Warn once, then let it go.. */
pr_warn_once("%s: no symbol version for %s\n", info->name, symname);
return 1;
bad_version:
pr_warn("%s: disagrees about version of symbol %s\n", info->name, symname);
return 0;
}
int check_modstruct_version(const struct load_info *info,
struct module *mod)
{
struct find_symbol_arg fsa = {
.name = "module_layout",
.gplok = true,
};
/*
* Since this should be found in kernel (which can't be removed), no
* locking is necessary -- use preempt_disable() to placate lockdep.
*/
preempt_disable();
if (!find_symbol(&fsa)) {
preempt_enable();
BUG();
}
preempt_enable();
return check_version(info, "module_layout", mod, fsa.crc);
}
/* First part is kernel version, which we ignore if module has crcs. */
int same_magic(const char *amagic, const char *bmagic,
bool has_crcs)
{
if (has_crcs) {
amagic += strcspn(amagic, " ");
bmagic += strcspn(bmagic, " ");
}
return strcmp(amagic, bmagic) == 0;
}
/*
* Generate the signature for all relevant module structures here.
* If these change, we don't want to try to parse the module.
*/
void module_layout(struct module *mod,
struct modversion_info *ver,
struct kernel_param *kp,
struct kernel_symbol *ks,
struct tracepoint * const *tp)
{
}
EXPORT_SYMBOL(module_layout);