| From 4da473d8c42fff8a1d63852fa684509f665afa3a Mon Sep 17 00:00:00 2001 |
| From: Jessica Yu <jeyu@kernel.org> |
| Date: Fri, 17 Jan 2020 13:32:21 +0100 |
| Subject: [PATCH] module: avoid setting info->name early in case we can fall |
| back to info->mod->name |
| |
| commit 708e0ada1916be765b7faa58854062f2bc620bbf upstream. |
| |
| In setup_load_info(), info->name (which contains the name of the module, |
| mostly used for early logging purposes before the module gets set up) |
| gets unconditionally assigned if .modinfo is missing despite the fact |
| that there is an if (!info->name) check near the end of the function. |
| Avoid assigning a placeholder string to info->name if .modinfo doesn't |
| exist, so that we can fall back to info->mod->name later on. |
| |
| Fixes: 5fdc7db6448a ("module: setup load info before module_sig_check()") |
| Reviewed-by: Miroslav Benes <mbenes@suse.cz> |
| Signed-off-by: Jessica Yu <jeyu@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/kernel/module.c b/kernel/module.c |
| index dbea27533af1..1ebdba80d447 100644 |
| --- a/kernel/module.c |
| +++ b/kernel/module.c |
| @@ -2961,9 +2961,7 @@ static int setup_load_info(struct load_info *info, int flags) |
| |
| /* Try to find a name early so we can log errors with a module name */ |
| info->index.info = find_sec(info, ".modinfo"); |
| - if (!info->index.info) |
| - info->name = "(missing .modinfo section)"; |
| - else |
| + if (info->index.info) |
| info->name = get_modinfo(info, "name"); |
| |
| /* Find internal symbols and strings. */ |
| @@ -2978,14 +2976,15 @@ static int setup_load_info(struct load_info *info, int flags) |
| } |
| |
| if (info->index.sym == 0) { |
| - pr_warn("%s: module has no symbols (stripped?)\n", info->name); |
| + pr_warn("%s: module has no symbols (stripped?)\n", |
| + info->name ?: "(missing .modinfo section or name field)"); |
| return -ENOEXEC; |
| } |
| |
| info->index.mod = find_sec(info, ".gnu.linkonce.this_module"); |
| if (!info->index.mod) { |
| pr_warn("%s: No module found in object\n", |
| - info->name ?: "(missing .modinfo name field)"); |
| + info->name ?: "(missing .modinfo section or name field)"); |
| return -ENOEXEC; |
| } |
| /* This is temporary: point mod into copy of data. */ |
| -- |
| 2.7.4 |
| |