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
Unified · Split
| @@ -209,7 +209,7 @@ extern void cleanup_module(void); · 208 unmodified lines | ||
| 209 | 209 | #ifdef MODULE |
| 210 | 210 | /* Creates an alias so file2alias.c can find device table. */ |
| 211 | 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 | 213 | __attribute__ ((unused, alias(__stringify(name)))) |
| 214 | 214 | #else /* !MODULE */ |
| 215 | 215 | #define MODULE_DEVICE_TABLE(type, name) |
| @@ -2707,21 +2707,21 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) · 2706 unmodified lines | ||
| 2707 | 2707 | } |
| 2708 | 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 | 2712 | if (!debug) |
| 2713 | 2713 | return; |
| 2714 | 2714 | #ifdef CONFIG_DYNAMIC_DEBUG |
| 2715 | − if (ddebug_add_module(debug, num, debug->modname)) | |
| 2715 | + if (ddebug_add_module(debug, num, mod->name)) | |
| 2716 | 2716 | pr_err("dynamic debug error adding module: %s\n", |
| 2717 | 2717 | debug->modname); |
| 2718 | 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 | 2723 | if (debug) |
| 2724 | − ddebug_remove_module(debug->modname); | |
| 2724 | + ddebug_remove_module(mod->name); | |
| 2725 | 2725 | } |
| 2726 | 2726 | |
| 2727 | 2727 | void * __weak module_alloc(unsigned long size) |
| @@ -3715,7 +3715,7 @@ static int load_module(struct load_info *info, const char __user *uargs, · 987 unmodified lines | ||
| 3715 | 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 | 3720 | /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ |
| 3721 | 3721 | ftrace_module_init(mod); |
| @@ -3779,7 +3779,7 @@ static int load_module(struct load_info *info, const char __user *uargs, · 57 unmodified lines | ||
| 3779 | 3779 | module_disable_nx(mod); |
| 3780 | 3780 | |
| 3781 | 3781 | ddebug_cleanup: |
| 3782 | − dynamic_debug_remove(info->debug); | |
| 3782 | + dynamic_debug_remove(mod, info->debug); | |
| 3783 | 3783 | synchronize_sched(); |
| 3784 | 3784 | kfree(mod->args); |
| 3785 | 3785 | free_arch_cleanup: |
| @@ -47,6 +47,12 @@ enum export { · 46 unmodified lines | ||
| 47 | 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 | 56 | #define PRINTF __attribute__ ((format (printf, 1, 2))) |
| 51 | 57 | |
| 52 | 58 | PRINTF void fatal(const char *fmt, ...) |
| @@ -2111,6 +2117,23 @@ static void check_exports(struct module *mod) · 2058 unmodified lines | ||
| 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 | 2138 | * Header for the generated file |
| 2116 | 2139 | **/ |
| @@ -2150,11 +2173,6 @@ static void add_staging_flag(struct buffer *b, const char *name) · 33 unmodified lines | ||
| 2150 | 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 | 2177 | * Record CRCs for unresolved symbols |
| 2160 | 2178 | **/ |
| @@ -2485,6 +2503,7 @@ int main(int argc, char **argv) · 324 unmodified lines | ||
| 2485 | 2503 | |
| 2486 | 2504 | buf.pos = 0; |
| 2487 | 2505 | |
| 2506 | + err |= check_modname_len(mod); | |
| 2488 | 2507 | add_header(&buf, mod); |
| 2489 | 2508 | add_intree_flag(&buf, !external_module); |
| 2490 | 2509 | add_staging_flag(&buf, mod->name); |