aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-13 14:28:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-13 14:28:19 -0400
commit4791bcccf8ce02c2bf6f9dfbc328a3a46d9e9569 (patch)
tree5224a477d2c8b81acf6798f719cf302de71a9c96
parent3882a734c19b3cd7feb9e30e1dbd8ae54ac0905a (diff)
parent0bf8bf50eddc7511b52461bae798cbfaa0157a34 (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.h2
-rw-r--r--kernel/module.c12
-rw-r--r--scripts/mod/modpost.c29
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) \
212extern const typeof(name) __mod_##type##__##name##_device_table \ 212extern 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
2710static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num) 2710static 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
2721static void dynamic_debug_remove(struct _ddebug *debug) 2721static 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
2727void * __weak module_alloc(unsigned long size) 2727void * __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
52PRINTF void fatal(const char *fmt, ...) 58PRINTF void fatal(const char *fmt, ...)
@@ -2111,6 +2117,23 @@ static void check_exports(struct module *mod)
2111 } 2117 }
2112} 2118}
2113 2119
2120static 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);