|
Jessica Yu |
31d0a4 |
From 50387e0798ac2b44e1a5b1625ec71c25ebd4aad6 Mon Sep 17 00:00:00 2001
|
|
Jessica Yu |
31d0a4 |
From: Jessica Yu <jeyu@kernel.org>
|
|
Jessica Yu |
31d0a4 |
Date: Fri, 22 Jun 2018 13:59:29 +0200
|
|
Jessica Yu |
31d0a4 |
Subject: [PATCH 1/5] module: make it clear when we're handling the module copy
|
|
Jessica Yu |
31d0a4 |
in info->hdr
|
|
Jessica Yu |
31d0a4 |
Git-commit: 81a0abd9f213704fbeeea1550ff202000e3c3cdf
|
|
Takashi Iwai |
22ff2f |
Patch-mainline: v4.19-rc1
|
|
Jessica Yu |
31d0a4 |
References: bsc#1093666
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
In load_module(), it's not always clear whether we're handling the
|
|
Jessica Yu |
31d0a4 |
temporary module copy in info->hdr (which is freed at the end of
|
|
Jessica Yu |
31d0a4 |
load_module()) or if we're handling the module already allocated and
|
|
Jessica Yu |
31d0a4 |
copied to it's final place. Adding an info->mod field and using it
|
|
Jessica Yu |
31d0a4 |
whenever we're handling the temporary copy makes that explicitly clear.
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
Signed-off-by: Jessica Yu <jeyu@kernel.org>
|
|
Jessica Yu |
31d0a4 |
Acked-by: Jessica Yu <jeyu@suse.de>
|
|
Jessica Yu |
31d0a4 |
---
|
|
Jessica Yu |
31d0a4 |
kernel/module.c | 44 ++++++++++++++++++++++----------------------
|
|
Jessica Yu |
31d0a4 |
1 file changed, 22 insertions(+), 22 deletions(-)
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
--- a/kernel/module.c
|
|
Jessica Yu |
31d0a4 |
+++ b/kernel/module.c
|
|
Jessica Yu |
31d0a4 |
@@ -302,6 +302,8 @@ int unregister_module_notifier(struct no
|
|
Jessica Yu |
31d0a4 |
EXPORT_SYMBOL(unregister_module_notifier);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
struct load_info {
|
|
Jessica Yu |
31d0a4 |
+ /* pointer to module in temporary copy, freed at end of load_module() */
|
|
Jessica Yu |
31d0a4 |
+ struct module *mod;
|
|
Jessica Yu |
31d0a4 |
Elf_Ehdr *hdr;
|
|
Jessica Yu |
31d0a4 |
unsigned long len;
|
|
Jessica Yu |
31d0a4 |
Elf_Shdr *sechdrs;
|
|
Jessica Yu |
31d0a4 |
@@ -2935,14 +2937,13 @@ static int rewrite_section_headers(struc
|
|
Jessica Yu |
31d0a4 |
* search for module section index etc), and do some basic section
|
|
Jessica Yu |
31d0a4 |
* verification.
|
|
Jessica Yu |
31d0a4 |
*
|
|
Jessica Yu |
31d0a4 |
- * Return the temporary module pointer (we'll replace it with the final
|
|
Jessica Yu |
31d0a4 |
- * one when we move the module sections around).
|
|
Jessica Yu |
31d0a4 |
+ * Set info->mod to the temporary copy of the module in info->hdr. The final one
|
|
Jessica Yu |
31d0a4 |
+ * will be allocated in move_module().
|
|
Jessica Yu |
31d0a4 |
*/
|
|
Jessica Yu |
31d0a4 |
-static struct module *setup_load_info(struct load_info *info, int flags)
|
|
Jessica Yu |
31d0a4 |
+static int setup_load_info(struct load_info *info, int flags)
|
|
Jessica Yu |
31d0a4 |
{
|
|
Jessica Yu |
31d0a4 |
unsigned int i;
|
|
Jessica Yu |
31d0a4 |
int err;
|
|
Jessica Yu |
31d0a4 |
- struct module *mod;
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
/* Set up the convenience variables */
|
|
Jessica Yu |
31d0a4 |
info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;
|
|
Jessica Yu |
31d0a4 |
@@ -2951,7 +2952,7 @@ static struct module *setup_load_info(st
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
err = rewrite_section_headers(info, flags);
|
|
Jessica Yu |
31d0a4 |
if (err)
|
|
Jessica Yu |
31d0a4 |
- return ERR_PTR(err);
|
|
Jessica Yu |
31d0a4 |
+ return err;
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
/* Find internal symbols and strings. */
|
|
Jessica Yu |
31d0a4 |
for (i = 1; i < info->hdr->e_shnum; i++) {
|
|
Jessica Yu |
31d0a4 |
@@ -2967,23 +2968,23 @@ static struct module *setup_load_info(st
|
|
Jessica Yu |
31d0a4 |
info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
|
|
Jessica Yu |
31d0a4 |
if (!info->index.mod) {
|
|
Jessica Yu |
31d0a4 |
pr_warn("No module found in object\n");
|
|
Jessica Yu |
31d0a4 |
- return ERR_PTR(-ENOEXEC);
|
|
Jessica Yu |
31d0a4 |
+ return -ENOEXEC;
|
|
Jessica Yu |
31d0a4 |
}
|
|
Jessica Yu |
31d0a4 |
/* This is temporary: point mod into copy of data. */
|
|
Jessica Yu |
31d0a4 |
- mod = (void *)info->sechdrs[info->index.mod].sh_addr;
|
|
Jessica Yu |
31d0a4 |
+ info->mod = (void *)info->sechdrs[info->index.mod].sh_addr;
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
if (info->index.sym == 0) {
|
|
Jessica Yu |
31d0a4 |
- pr_warn("%s: module has no symbols (stripped?)\n", mod->name);
|
|
Jessica Yu |
31d0a4 |
- return ERR_PTR(-ENOEXEC);
|
|
Jessica Yu |
31d0a4 |
+ pr_warn("%s: module has no symbols (stripped?)\n", info->mod->name);
|
|
Jessica Yu |
31d0a4 |
+ return -ENOEXEC;
|
|
Jessica Yu |
31d0a4 |
}
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
info->index.pcpu = find_pcpusec(info);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
/* Check module struct version now, before we try to use module. */
|
|
Jessica Yu |
31d0a4 |
- if (!check_modstruct_version(info->sechdrs, info->index.vers, mod))
|
|
Jessica Yu |
31d0a4 |
- return ERR_PTR(-ENOEXEC);
|
|
Jessica Yu |
31d0a4 |
+ if (!check_modstruct_version(info->sechdrs, info->index.vers, info->mod))
|
|
Jessica Yu |
31d0a4 |
+ return -ENOEXEC;
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
- return mod;
|
|
Jessica Yu |
31d0a4 |
+ return 0;
|
|
Jessica Yu |
31d0a4 |
}
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
|
|
Jessica Yu |
31d0a4 |
@@ -3274,25 +3275,24 @@ core_param(module_blacklist, module_blac
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
static struct module *layout_and_allocate(struct load_info *info, int flags)
|
|
Jessica Yu |
31d0a4 |
{
|
|
Jessica Yu |
31d0a4 |
- /* Module within temporary copy. */
|
|
Jessica Yu |
31d0a4 |
struct module *mod;
|
|
Jessica Yu |
31d0a4 |
unsigned int ndx;
|
|
Jessica Yu |
31d0a4 |
int err;
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
- mod = setup_load_info(info, flags);
|
|
Jessica Yu |
31d0a4 |
- if (IS_ERR(mod))
|
|
Jessica Yu |
31d0a4 |
- return mod;
|
|
Jessica Yu |
31d0a4 |
+ err = setup_load_info(info, flags);
|
|
Jessica Yu |
31d0a4 |
+ if (err)
|
|
Jessica Yu |
31d0a4 |
+ return ERR_PTR(err);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
- if (blacklisted(mod->name))
|
|
Jessica Yu |
31d0a4 |
+ if (blacklisted(info->mod->name))
|
|
Jessica Yu |
31d0a4 |
return ERR_PTR(-EPERM);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
- err = check_modinfo(mod, info, flags);
|
|
Jessica Yu |
31d0a4 |
+ err = check_modinfo(info->mod, info, flags);
|
|
Jessica Yu |
31d0a4 |
if (err)
|
|
Jessica Yu |
31d0a4 |
return ERR_PTR(err);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
/* Allow arches to frob section contents and sizes. */
|
|
Jessica Yu |
31d0a4 |
err = module_frob_arch_sections(info->hdr, info->sechdrs,
|
|
Jessica Yu |
31d0a4 |
- info->secstrings, mod);
|
|
Jessica Yu |
31d0a4 |
+ info->secstrings, info->mod);
|
|
Jessica Yu |
31d0a4 |
if (err < 0)
|
|
Jessica Yu |
31d0a4 |
return ERR_PTR(err);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
@@ -3311,11 +3311,11 @@ static struct module *layout_and_allocat
|
|
Jessica Yu |
31d0a4 |
/* Determine total sizes, and put offsets in sh_entsize. For now
|
|
Jessica Yu |
31d0a4 |
this is done generically; there doesn't appear to be any
|
|
Jessica Yu |
31d0a4 |
special cases for the architectures. */
|
|
Jessica Yu |
31d0a4 |
- layout_sections(mod, info);
|
|
Jessica Yu |
31d0a4 |
- layout_symtab(mod, info);
|
|
Jessica Yu |
31d0a4 |
+ layout_sections(info->mod, info);
|
|
Jessica Yu |
31d0a4 |
+ layout_symtab(info->mod, info);
|
|
Jessica Yu |
31d0a4 |
|
|
Jessica Yu |
31d0a4 |
/* Allocate and move to the final place */
|
|
Jessica Yu |
31d0a4 |
- err = move_module(mod, info);
|
|
Jessica Yu |
31d0a4 |
+ err = move_module(info->mod, info);
|
|
Jessica Yu |
31d0a4 |
if (err)
|
|
Jessica Yu |
31d0a4 |
return ERR_PTR(err);
|
|
Jessica Yu |
31d0a4 |
|