summaryrefslogtreecommitdiff
path: root/arch/mips/kernel/module-rela.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2016-04-19 11:38:52 +0300
committerIngo Molnar <mingo@kernel.org>2016-04-19 11:38:52 +0300
commit6666ea558b1f4134291c15ac59366f69c2d1f321 (patch)
tree99e4204b51e69a12721123d3bb1912f6ca0a2726 /arch/mips/kernel/module-rela.c
parent91ed140d6c1e168b11bbbddac4f6066f40a0c6b5 (diff)
parentc3b46c73264b03000d1e18b22f5caf63332547c9 (diff)
downloadlinux-6666ea558b1f4134291c15ac59366f69c2d1f321.tar.xz
Merge tag 'v4.6-rc4' into x86/asm, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/mips/kernel/module-rela.c')
-rw-r--r--arch/mips/kernel/module-rela.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/mips/kernel/module-rela.c b/arch/mips/kernel/module-rela.c
index 2b70723071c3..9083d63b765c 100644
--- a/arch/mips/kernel/module-rela.c
+++ b/arch/mips/kernel/module-rela.c
@@ -109,9 +109,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
struct module *me)
{
Elf_Mips_Rela *rel = (void *) sechdrs[relsec].sh_addr;
+ int (*handler)(struct module *me, u32 *location, Elf_Addr v);
Elf_Sym *sym;
u32 *location;
- unsigned int i;
+ unsigned int i, type;
Elf_Addr v;
int res;
@@ -134,9 +135,21 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
return -ENOENT;
}
- v = sym->st_value + rel[i].r_addend;
+ type = ELF_MIPS_R_TYPE(rel[i]);
+
+ if (type < ARRAY_SIZE(reloc_handlers_rela))
+ handler = reloc_handlers_rela[type];
+ else
+ handler = NULL;
- res = reloc_handlers_rela[ELF_MIPS_R_TYPE(rel[i])](me, location, v);
+ if (!handler) {
+ pr_err("%s: Unknown relocation type %u\n",
+ me->name, type);
+ return -EINVAL;
+ }
+
+ v = sym->st_value + rel[i].r_addend;
+ res = handler(me, location, v);
if (res)
return res;
}