Message ID | 20221031120733.3956781-2-npiggin@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | powerpc module arch checks | expand |
On Mon, Oct 31, 2022 at 10:07:32PM +1000, Nicholas Piggin wrote: > The elf_check_arch() function is also used to test compatibility of > usermode binaries. Kernel modules may have more specific requirements, > for example powerpc would like to test for ABI version compatibility. > > Add a weak module_elf_check_arch() that defaults to true, and call it > from elf_validity_check(). > > Cc: Michael Ellerman <mpe@ellerman.id.au> > Signed-off-by: Jessica Yu <jeyu@kernel.org> > [np: added changelog, adjust name, rebase] > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Acked-by: Luis Chamberlain <mcgrof@kernel.org> Luis
diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index 9e09d11ffe5b..7b4587a19189 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h @@ -13,6 +13,9 @@ * must be implemented by each architecture. */ +/* arch may override to do additional checking of ELF header architecture */ +bool module_elf_check_arch(Elf_Ehdr *hdr); + /* Adjust arch-specific sections. Return 0 on success. */ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, diff --git a/kernel/module/main.c b/kernel/module/main.c index d02d39c7174e..7b3f6fb0d428 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -1674,6 +1674,11 @@ static int elf_validity_check(struct load_info *info) info->hdr->e_machine); goto no_exec; } + if (!module_elf_check_arch(info->hdr)) { + pr_err("Invalid module architecture in ELF header: %u\n", + info->hdr->e_machine); + goto no_exec; + } if (info->hdr->e_shentsize != sizeof(Elf_Shdr)) { pr_err("Invalid ELF section header size\n"); goto no_exec; @@ -2247,6 +2252,11 @@ static void flush_module_icache(const struct module *mod) (unsigned long)mod->core_layout.base + mod->core_layout.size); } +bool __weak module_elf_check_arch(Elf_Ehdr *hdr) +{ + return true; +} + int __weak module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, char *secstrings,