diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-13 14:28:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-13 14:28:19 -0400 |
commit | 4791bcccf8ce02c2bf6f9dfbc328a3a46d9e9569 (patch) | |
tree | 5224a477d2c8b81acf6798f719cf302de71a9c96 | |
parent | 3882a734c19b3cd7feb9e30e1dbd8ae54ac0905a (diff) | |
parent | 0bf8bf50eddc7511b52461bae798cbfaa0157a34 (diff) |
Merge tag 'modules-for-v4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
Pull modules updates from Jessica Yu:
"Summary of modules changes for the 4.14 merge window:
- minor code cleanups and fixes
- modpost: avoid building modules that have names that exceed the
size of the name field in struct module"
* tag 'modules-for-v4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
module: Remove const attribute from alias for MODULE_DEVICE_TABLE
module: fix ddebug_remove_module()
modpost: abort if module name is too long
-rw-r--r-- | include/linux/module.h | 2 | ||||
-rw-r--r-- | kernel/module.c | 12 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 29 |
3 files changed, 31 insertions, 12 deletions
diff --git a/include/linux/module.h b/include/linux/module.h index e7bdd549e527..fe5aa3736707 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -209,7 +209,7 @@ extern void cleanup_module(void); | |||
209 | #ifdef MODULE | 209 | #ifdef MODULE |
210 | /* Creates an alias so file2alias.c can find device table. */ | 210 | /* Creates an alias so file2alias.c can find device table. */ |
211 | #define MODULE_DEVICE_TABLE(type, name) \ | 211 | #define MODULE_DEVICE_TABLE(type, name) \ |
212 | extern const typeof(name) __mod_##type##__##name##_device_table \ | 212 | extern typeof(name) __mod_##type##__##name##_device_table \ |
213 | __attribute__ ((unused, alias(__stringify(name)))) | 213 | __attribute__ ((unused, alias(__stringify(name)))) |
214 | #else /* !MODULE */ | 214 | #else /* !MODULE */ |
215 | #define MODULE_DEVICE_TABLE(type, name) | 215 | #define MODULE_DEVICE_TABLE(type, name) |
diff --git a/kernel/module.c b/kernel/module.c index 40f983cbea81..de66ec825992 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -2707,21 +2707,21 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) | |||
2707 | } | 2707 | } |
2708 | #endif /* CONFIG_KALLSYMS */ | 2708 | #endif /* CONFIG_KALLSYMS */ |
2709 | 2709 | ||
2710 | static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num) | 2710 | static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num) |
2711 | { | 2711 | { |
2712 | if (!debug) | 2712 | if (!debug) |
2713 | return; | 2713 | return; |
2714 | #ifdef CONFIG_DYNAMIC_DEBUG | 2714 | #ifdef CONFIG_DYNAMIC_DEBUG |
2715 | if (ddebug_add_module(debug, num, debug->modname)) | 2715 | if (ddebug_add_module(debug, num, mod->name)) |
2716 | pr_err("dynamic debug error adding module: %s\n", | 2716 | pr_err("dynamic debug error adding module: %s\n", |
2717 | debug->modname); | 2717 | debug->modname); |
2718 | #endif | 2718 | #endif |
2719 | } | 2719 | } |
2720 | 2720 | ||
2721 | static void dynamic_debug_remove(struct _ddebug *debug) | 2721 | static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug) |
2722 | { | 2722 | { |
2723 | if (debug) | 2723 | if (debug) |
2724 | ddebug_remove_module(debug->modname); | 2724 | ddebug_remove_module(mod->name); |
2725 | } | 2725 | } |
2726 | 2726 | ||
2727 | void * __weak module_alloc(unsigned long size) | 2727 | void * __weak module_alloc(unsigned long size) |
@@ -3715,7 +3715,7 @@ static int load_module(struct load_info *info, const char __user *uargs, | |||
3715 | goto free_arch_cleanup; | 3715 | goto free_arch_cleanup; |
3716 | } | 3716 | } |
3717 | 3717 | ||
3718 | dynamic_debug_setup(info->debug, info->num_debug); | 3718 | dynamic_debug_setup(mod, info->debug, info->num_debug); |
3719 | 3719 | ||
3720 | /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ | 3720 | /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ |
3721 | ftrace_module_init(mod); | 3721 | ftrace_module_init(mod); |
@@ -3779,7 +3779,7 @@ static int load_module(struct load_info *info, const char __user *uargs, | |||
3779 | module_disable_nx(mod); | 3779 | module_disable_nx(mod); |
3780 | 3780 | ||
3781 | ddebug_cleanup: | 3781 | ddebug_cleanup: |
3782 | dynamic_debug_remove(info->debug); | 3782 | dynamic_debug_remove(mod, info->debug); |
3783 | synchronize_sched(); | 3783 | synchronize_sched(); |
3784 | kfree(mod->args); | 3784 | kfree(mod->args); |
3785 | free_arch_cleanup: | 3785 | free_arch_cleanup: |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index b920d186ad4a..98314b400a95 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -47,6 +47,12 @@ enum export { | |||
47 | export_unused_gpl, export_gpl_future, export_unknown | 47 | export_unused_gpl, export_gpl_future, export_unknown |
48 | }; | 48 | }; |
49 | 49 | ||
50 | /* In kernel, this size is defined in linux/module.h; | ||
51 | * here we use Elf_Addr instead of long for covering cross-compile | ||
52 | */ | ||
53 | |||
54 | #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) | ||
55 | |||
50 | #define PRINTF __attribute__ ((format (printf, 1, 2))) | 56 | #define PRINTF __attribute__ ((format (printf, 1, 2))) |
51 | 57 | ||
52 | PRINTF void fatal(const char *fmt, ...) | 58 | PRINTF void fatal(const char *fmt, ...) |
@@ -2111,6 +2117,23 @@ static void check_exports(struct module *mod) | |||
2111 | } | 2117 | } |
2112 | } | 2118 | } |
2113 | 2119 | ||
2120 | static int check_modname_len(struct module *mod) | ||
2121 | { | ||
2122 | const char *mod_name; | ||
2123 | |||
2124 | mod_name = strrchr(mod->name, '/'); | ||
2125 | if (mod_name == NULL) | ||
2126 | mod_name = mod->name; | ||
2127 | else | ||
2128 | mod_name++; | ||
2129 | if (strlen(mod_name) >= MODULE_NAME_LEN) { | ||
2130 | merror("module name is too long [%s.ko]\n", mod->name); | ||
2131 | return 1; | ||
2132 | } | ||
2133 | |||
2134 | return 0; | ||
2135 | } | ||
2136 | |||
2114 | /** | 2137 | /** |
2115 | * Header for the generated file | 2138 | * Header for the generated file |
2116 | **/ | 2139 | **/ |
@@ -2150,11 +2173,6 @@ static void add_staging_flag(struct buffer *b, const char *name) | |||
2150 | buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); | 2173 | buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); |
2151 | } | 2174 | } |
2152 | 2175 | ||
2153 | /* In kernel, this size is defined in linux/module.h; | ||
2154 | * here we use Elf_Addr instead of long for covering cross-compile | ||
2155 | */ | ||
2156 | #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) | ||
2157 | |||
2158 | /** | 2176 | /** |
2159 | * Record CRCs for unresolved symbols | 2177 | * Record CRCs for unresolved symbols |
2160 | **/ | 2178 | **/ |
@@ -2485,6 +2503,7 @@ int main(int argc, char **argv) | |||
2485 | 2503 | ||
2486 | buf.pos = 0; | 2504 | buf.pos = 0; |
2487 | 2505 | ||
2506 | err |= check_modname_len(mod); | ||
2488 | add_header(&buf, mod); | 2507 | add_header(&buf, mod); |
2489 | add_intree_flag(&buf, !external_module); | 2508 | add_intree_flag(&buf, !external_module); |
2490 | add_staging_flag(&buf, mod->name); | 2509 | add_staging_flag(&buf, mod->name); |