1cfc1d277SAaron Tomlin // SPDX-License-Identifier: GPL-2.0-or-later 2cfc1d277SAaron Tomlin /* 3cfc1d277SAaron Tomlin * Copyright (C) 2002 Richard Henderson 4cfc1d277SAaron Tomlin * Copyright (C) 2001 Rusty Russell, 2002, 2010 Rusty Russell IBM. 546752820SLuis Chamberlain * Copyright (C) 2023 Luis Chamberlain <mcgrof@kernel.org> 6cfc1d277SAaron Tomlin */ 7cfc1d277SAaron Tomlin 8cfc1d277SAaron Tomlin #define INCLUDE_VERMAGIC 9cfc1d277SAaron Tomlin 10cfc1d277SAaron Tomlin #include <linux/export.h> 11cfc1d277SAaron Tomlin #include <linux/extable.h> 12cfc1d277SAaron Tomlin #include <linux/moduleloader.h> 13cfc1d277SAaron Tomlin #include <linux/module_signature.h> 14cfc1d277SAaron Tomlin #include <linux/trace_events.h> 15cfc1d277SAaron Tomlin #include <linux/init.h> 16cfc1d277SAaron Tomlin #include <linux/kallsyms.h> 17cfc1d277SAaron Tomlin #include <linux/buildid.h> 18cfc1d277SAaron Tomlin #include <linux/fs.h> 19cfc1d277SAaron Tomlin #include <linux/kernel.h> 20cfc1d277SAaron Tomlin #include <linux/kernel_read_file.h> 21fbed4feaSChristophe JAILLET #include <linux/kstrtox.h> 22cfc1d277SAaron Tomlin #include <linux/slab.h> 23cfc1d277SAaron Tomlin #include <linux/vmalloc.h> 24cfc1d277SAaron Tomlin #include <linux/elf.h> 25cfc1d277SAaron Tomlin #include <linux/seq_file.h> 26cfc1d277SAaron Tomlin #include <linux/syscalls.h> 27cfc1d277SAaron Tomlin #include <linux/fcntl.h> 28cfc1d277SAaron Tomlin #include <linux/rcupdate.h> 29cfc1d277SAaron Tomlin #include <linux/capability.h> 30cfc1d277SAaron Tomlin #include <linux/cpu.h> 31cfc1d277SAaron Tomlin #include <linux/moduleparam.h> 32cfc1d277SAaron Tomlin #include <linux/errno.h> 33cfc1d277SAaron Tomlin #include <linux/err.h> 34cfc1d277SAaron Tomlin #include <linux/vermagic.h> 35cfc1d277SAaron Tomlin #include <linux/notifier.h> 36cfc1d277SAaron Tomlin #include <linux/sched.h> 37cfc1d277SAaron Tomlin #include <linux/device.h> 38cfc1d277SAaron Tomlin #include <linux/string.h> 39cfc1d277SAaron Tomlin #include <linux/mutex.h> 40cfc1d277SAaron Tomlin #include <linux/rculist.h> 41cfc1d277SAaron Tomlin #include <linux/uaccess.h> 42cfc1d277SAaron Tomlin #include <asm/cacheflush.h> 43cfc1d277SAaron Tomlin #include <linux/set_memory.h> 44cfc1d277SAaron Tomlin #include <asm/mmu_context.h> 45cfc1d277SAaron Tomlin #include <linux/license.h> 46cfc1d277SAaron Tomlin #include <asm/sections.h> 47cfc1d277SAaron Tomlin #include <linux/tracepoint.h> 48cfc1d277SAaron Tomlin #include <linux/ftrace.h> 49cfc1d277SAaron Tomlin #include <linux/livepatch.h> 50cfc1d277SAaron Tomlin #include <linux/async.h> 51cfc1d277SAaron Tomlin #include <linux/percpu.h> 52cfc1d277SAaron Tomlin #include <linux/kmemleak.h> 53cfc1d277SAaron Tomlin #include <linux/jump_label.h> 54cfc1d277SAaron Tomlin #include <linux/pfn.h> 55cfc1d277SAaron Tomlin #include <linux/bsearch.h> 56cfc1d277SAaron Tomlin #include <linux/dynamic_debug.h> 57cfc1d277SAaron Tomlin #include <linux/audit.h> 5889245600SSami Tolvanen #include <linux/cfi.h> 59df3e764dSLuis Chamberlain #include <linux/debugfs.h> 60cfc1d277SAaron Tomlin #include <uapi/linux/module.h> 61cfc1d277SAaron Tomlin #include "internal.h" 62cfc1d277SAaron Tomlin 63cfc1d277SAaron Tomlin #define CREATE_TRACE_POINTS 64cfc1d277SAaron Tomlin #include <trace/events/module.h> 65cfc1d277SAaron Tomlin 66cfc1d277SAaron Tomlin /* 67cfc1d277SAaron Tomlin * Mutex protects: 68cfc1d277SAaron Tomlin * 1) List of modules (also safely readable with preempt_disable), 69cfc1d277SAaron Tomlin * 2) module_use links, 7055ce556dSChristophe Leroy * 3) mod_tree.addr_min/mod_tree.addr_max. 71cfc1d277SAaron Tomlin * (delete and add uses RCU list operations). 72cfc1d277SAaron Tomlin */ 738ab4ed08SAaron Tomlin DEFINE_MUTEX(module_mutex); 748ab4ed08SAaron Tomlin LIST_HEAD(modules); 75cfc1d277SAaron Tomlin 76cfc1d277SAaron Tomlin /* Work queue for freeing init sections in success case */ 77cfc1d277SAaron Tomlin static void do_free_init(struct work_struct *w); 78cfc1d277SAaron Tomlin static DECLARE_WORK(init_free_wq, do_free_init); 79cfc1d277SAaron Tomlin static LLIST_HEAD(init_free_list); 80cfc1d277SAaron Tomlin 8158d208deSAaron Tomlin struct mod_tree_root mod_tree __cacheline_aligned = { 82cfc1d277SAaron Tomlin .addr_min = -1UL, 83cfc1d277SAaron Tomlin }; 84cfc1d277SAaron Tomlin 8547889798SAaron Tomlin struct symsearch { 8647889798SAaron Tomlin const struct kernel_symbol *start, *stop; 8747889798SAaron Tomlin const s32 *crcs; 8847889798SAaron Tomlin enum mod_license license; 8947889798SAaron Tomlin }; 9047889798SAaron Tomlin 91cfc1d277SAaron Tomlin /* 92ac3b4328SSong Liu * Bounds of module memory, for speeding up __module_address. 93cfc1d277SAaron Tomlin * Protected by module_mutex. 94cfc1d277SAaron Tomlin */ 95ac3b4328SSong Liu static void __mod_update_bounds(enum mod_mem_type type __maybe_unused, void *base, 96ac3b4328SSong Liu unsigned int size, struct mod_tree_root *tree) 97cfc1d277SAaron Tomlin { 98cfc1d277SAaron Tomlin unsigned long min = (unsigned long)base; 99cfc1d277SAaron Tomlin unsigned long max = min + size; 100cfc1d277SAaron Tomlin 101ac3b4328SSong Liu #ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC 102ac3b4328SSong Liu if (mod_mem_type_is_core_data(type)) { 103ac3b4328SSong Liu if (min < tree->data_addr_min) 104ac3b4328SSong Liu tree->data_addr_min = min; 105ac3b4328SSong Liu if (max > tree->data_addr_max) 106ac3b4328SSong Liu tree->data_addr_max = max; 107ac3b4328SSong Liu return; 108ac3b4328SSong Liu } 109ac3b4328SSong Liu #endif 110446d5566SChristophe Leroy if (min < tree->addr_min) 111446d5566SChristophe Leroy tree->addr_min = min; 112446d5566SChristophe Leroy if (max > tree->addr_max) 113446d5566SChristophe Leroy tree->addr_max = max; 114cfc1d277SAaron Tomlin } 115cfc1d277SAaron Tomlin 116cfc1d277SAaron Tomlin static void mod_update_bounds(struct module *mod) 117cfc1d277SAaron Tomlin { 118ac3b4328SSong Liu for_each_mod_mem_type(type) { 119ac3b4328SSong Liu struct module_memory *mod_mem = &mod->mem[type]; 120ac3b4328SSong Liu 121ac3b4328SSong Liu if (mod_mem->size) 122ac3b4328SSong Liu __mod_update_bounds(type, mod_mem->base, mod_mem->size, &mod_tree); 123ac3b4328SSong Liu } 124cfc1d277SAaron Tomlin } 125cfc1d277SAaron Tomlin 126cfc1d277SAaron Tomlin /* Block module loading/unloading? */ 127ecc726f1SChristophe Leroy int modules_disabled; 128cfc1d277SAaron Tomlin core_param(nomodule, modules_disabled, bint, 0); 129cfc1d277SAaron Tomlin 130cfc1d277SAaron Tomlin /* Waiting for a module to finish initializing? */ 131cfc1d277SAaron Tomlin static DECLARE_WAIT_QUEUE_HEAD(module_wq); 132cfc1d277SAaron Tomlin 133cfc1d277SAaron Tomlin static BLOCKING_NOTIFIER_HEAD(module_notify_list); 134cfc1d277SAaron Tomlin 135cfc1d277SAaron Tomlin int register_module_notifier(struct notifier_block *nb) 136cfc1d277SAaron Tomlin { 137cfc1d277SAaron Tomlin return blocking_notifier_chain_register(&module_notify_list, nb); 138cfc1d277SAaron Tomlin } 139cfc1d277SAaron Tomlin EXPORT_SYMBOL(register_module_notifier); 140cfc1d277SAaron Tomlin 141cfc1d277SAaron Tomlin int unregister_module_notifier(struct notifier_block *nb) 142cfc1d277SAaron Tomlin { 143cfc1d277SAaron Tomlin return blocking_notifier_chain_unregister(&module_notify_list, nb); 144cfc1d277SAaron Tomlin } 145cfc1d277SAaron Tomlin EXPORT_SYMBOL(unregister_module_notifier); 146cfc1d277SAaron Tomlin 147cfc1d277SAaron Tomlin /* 148cfc1d277SAaron Tomlin * We require a truly strong try_module_get(): 0 means success. 149cfc1d277SAaron Tomlin * Otherwise an error is returned due to ongoing or failed 150cfc1d277SAaron Tomlin * initialization etc. 151cfc1d277SAaron Tomlin */ 152cfc1d277SAaron Tomlin static inline int strong_try_module_get(struct module *mod) 153cfc1d277SAaron Tomlin { 154cfc1d277SAaron Tomlin BUG_ON(mod && mod->state == MODULE_STATE_UNFORMED); 155cfc1d277SAaron Tomlin if (mod && mod->state == MODULE_STATE_COMING) 156cfc1d277SAaron Tomlin return -EBUSY; 157cfc1d277SAaron Tomlin if (try_module_get(mod)) 158cfc1d277SAaron Tomlin return 0; 159cfc1d277SAaron Tomlin else 160cfc1d277SAaron Tomlin return -ENOENT; 161cfc1d277SAaron Tomlin } 162cfc1d277SAaron Tomlin 163cfc1d277SAaron Tomlin static inline void add_taint_module(struct module *mod, unsigned flag, 164cfc1d277SAaron Tomlin enum lockdep_ok lockdep_ok) 165cfc1d277SAaron Tomlin { 166cfc1d277SAaron Tomlin add_taint(flag, lockdep_ok); 167cfc1d277SAaron Tomlin set_bit(flag, &mod->taints); 168cfc1d277SAaron Tomlin } 169cfc1d277SAaron Tomlin 170cfc1d277SAaron Tomlin /* 171cfc1d277SAaron Tomlin * A thread that wants to hold a reference to a module only while it 172cfc1d277SAaron Tomlin * is running can call this to safely exit. 173cfc1d277SAaron Tomlin */ 174cfc1d277SAaron Tomlin void __noreturn __module_put_and_kthread_exit(struct module *mod, long code) 175cfc1d277SAaron Tomlin { 176cfc1d277SAaron Tomlin module_put(mod); 177cfc1d277SAaron Tomlin kthread_exit(code); 178cfc1d277SAaron Tomlin } 179cfc1d277SAaron Tomlin EXPORT_SYMBOL(__module_put_and_kthread_exit); 180cfc1d277SAaron Tomlin 181cfc1d277SAaron Tomlin /* Find a module section: 0 means not found. */ 182cfc1d277SAaron Tomlin static unsigned int find_sec(const struct load_info *info, const char *name) 183cfc1d277SAaron Tomlin { 184cfc1d277SAaron Tomlin unsigned int i; 185cfc1d277SAaron Tomlin 186cfc1d277SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 187cfc1d277SAaron Tomlin Elf_Shdr *shdr = &info->sechdrs[i]; 188cfc1d277SAaron Tomlin /* Alloc bit cleared means "ignore it." */ 189cfc1d277SAaron Tomlin if ((shdr->sh_flags & SHF_ALLOC) 190cfc1d277SAaron Tomlin && strcmp(info->secstrings + shdr->sh_name, name) == 0) 191cfc1d277SAaron Tomlin return i; 192cfc1d277SAaron Tomlin } 193cfc1d277SAaron Tomlin return 0; 194cfc1d277SAaron Tomlin } 195cfc1d277SAaron Tomlin 196cfc1d277SAaron Tomlin /* Find a module section, or NULL. */ 197cfc1d277SAaron Tomlin static void *section_addr(const struct load_info *info, const char *name) 198cfc1d277SAaron Tomlin { 199cfc1d277SAaron Tomlin /* Section 0 has sh_addr 0. */ 200cfc1d277SAaron Tomlin return (void *)info->sechdrs[find_sec(info, name)].sh_addr; 201cfc1d277SAaron Tomlin } 202cfc1d277SAaron Tomlin 203cfc1d277SAaron Tomlin /* Find a module section, or NULL. Fill in number of "objects" in section. */ 204cfc1d277SAaron Tomlin static void *section_objs(const struct load_info *info, 205cfc1d277SAaron Tomlin const char *name, 206cfc1d277SAaron Tomlin size_t object_size, 207cfc1d277SAaron Tomlin unsigned int *num) 208cfc1d277SAaron Tomlin { 209cfc1d277SAaron Tomlin unsigned int sec = find_sec(info, name); 210cfc1d277SAaron Tomlin 211cfc1d277SAaron Tomlin /* Section 0 has sh_addr 0 and sh_size 0. */ 212cfc1d277SAaron Tomlin *num = info->sechdrs[sec].sh_size / object_size; 213cfc1d277SAaron Tomlin return (void *)info->sechdrs[sec].sh_addr; 214cfc1d277SAaron Tomlin } 215cfc1d277SAaron Tomlin 216cfc1d277SAaron Tomlin /* Find a module section: 0 means not found. Ignores SHF_ALLOC flag. */ 217cfc1d277SAaron Tomlin static unsigned int find_any_sec(const struct load_info *info, const char *name) 218cfc1d277SAaron Tomlin { 219cfc1d277SAaron Tomlin unsigned int i; 220cfc1d277SAaron Tomlin 221cfc1d277SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 222cfc1d277SAaron Tomlin Elf_Shdr *shdr = &info->sechdrs[i]; 223cfc1d277SAaron Tomlin if (strcmp(info->secstrings + shdr->sh_name, name) == 0) 224cfc1d277SAaron Tomlin return i; 225cfc1d277SAaron Tomlin } 226cfc1d277SAaron Tomlin return 0; 227cfc1d277SAaron Tomlin } 228cfc1d277SAaron Tomlin 229cfc1d277SAaron Tomlin /* 230cfc1d277SAaron Tomlin * Find a module section, or NULL. Fill in number of "objects" in section. 231cfc1d277SAaron Tomlin * Ignores SHF_ALLOC flag. 232cfc1d277SAaron Tomlin */ 233cfc1d277SAaron Tomlin static __maybe_unused void *any_section_objs(const struct load_info *info, 234cfc1d277SAaron Tomlin const char *name, 235cfc1d277SAaron Tomlin size_t object_size, 236cfc1d277SAaron Tomlin unsigned int *num) 237cfc1d277SAaron Tomlin { 238cfc1d277SAaron Tomlin unsigned int sec = find_any_sec(info, name); 239cfc1d277SAaron Tomlin 240cfc1d277SAaron Tomlin /* Section 0 has sh_addr 0 and sh_size 0. */ 241cfc1d277SAaron Tomlin *num = info->sechdrs[sec].sh_size / object_size; 242cfc1d277SAaron Tomlin return (void *)info->sechdrs[sec].sh_addr; 243cfc1d277SAaron Tomlin } 244cfc1d277SAaron Tomlin 245cfc1d277SAaron Tomlin #ifndef CONFIG_MODVERSIONS 246cfc1d277SAaron Tomlin #define symversion(base, idx) NULL 247cfc1d277SAaron Tomlin #else 248cfc1d277SAaron Tomlin #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL) 249cfc1d277SAaron Tomlin #endif 250cfc1d277SAaron Tomlin 251cfc1d277SAaron Tomlin static const char *kernel_symbol_name(const struct kernel_symbol *sym) 252cfc1d277SAaron Tomlin { 253cfc1d277SAaron Tomlin #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 254cfc1d277SAaron Tomlin return offset_to_ptr(&sym->name_offset); 255cfc1d277SAaron Tomlin #else 256cfc1d277SAaron Tomlin return sym->name; 257cfc1d277SAaron Tomlin #endif 258cfc1d277SAaron Tomlin } 259cfc1d277SAaron Tomlin 260cfc1d277SAaron Tomlin static const char *kernel_symbol_namespace(const struct kernel_symbol *sym) 261cfc1d277SAaron Tomlin { 262cfc1d277SAaron Tomlin #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 263cfc1d277SAaron Tomlin if (!sym->namespace_offset) 264cfc1d277SAaron Tomlin return NULL; 265cfc1d277SAaron Tomlin return offset_to_ptr(&sym->namespace_offset); 266cfc1d277SAaron Tomlin #else 267cfc1d277SAaron Tomlin return sym->namespace; 268cfc1d277SAaron Tomlin #endif 269cfc1d277SAaron Tomlin } 270cfc1d277SAaron Tomlin 27191fb02f3SAaron Tomlin int cmp_name(const void *name, const void *sym) 272cfc1d277SAaron Tomlin { 273cfc1d277SAaron Tomlin return strcmp(name, kernel_symbol_name(sym)); 274cfc1d277SAaron Tomlin } 275cfc1d277SAaron Tomlin 276cfc1d277SAaron Tomlin static bool find_exported_symbol_in_section(const struct symsearch *syms, 277cfc1d277SAaron Tomlin struct module *owner, 278c6eee9dfSMasahiro Yamada struct find_symbol_arg *fsa) 279cfc1d277SAaron Tomlin { 280cfc1d277SAaron Tomlin struct kernel_symbol *sym; 281cfc1d277SAaron Tomlin 282cdd66eb5SMasahiro Yamada if (!fsa->gplok && syms->license == GPL_ONLY) 283cdd66eb5SMasahiro Yamada return false; 284cdd66eb5SMasahiro Yamada 285cfc1d277SAaron Tomlin sym = bsearch(fsa->name, syms->start, syms->stop - syms->start, 286cfc1d277SAaron Tomlin sizeof(struct kernel_symbol), cmp_name); 2877390b94aSMasahiro Yamada if (!sym) 288cfc1d277SAaron Tomlin return false; 2897390b94aSMasahiro Yamada 2907390b94aSMasahiro Yamada fsa->owner = owner; 2917390b94aSMasahiro Yamada fsa->crc = symversion(syms->crcs, sym - syms->start); 2927390b94aSMasahiro Yamada fsa->sym = sym; 2937390b94aSMasahiro Yamada fsa->license = syms->license; 2947390b94aSMasahiro Yamada 2957390b94aSMasahiro Yamada return true; 296cfc1d277SAaron Tomlin } 297cfc1d277SAaron Tomlin 298cfc1d277SAaron Tomlin /* 299cfc1d277SAaron Tomlin * Find an exported symbol and return it, along with, (optional) crc and 300cfc1d277SAaron Tomlin * (optional) module which owns it. Needs preempt disabled or module_mutex. 301cfc1d277SAaron Tomlin */ 30247889798SAaron Tomlin bool find_symbol(struct find_symbol_arg *fsa) 303cfc1d277SAaron Tomlin { 304cfc1d277SAaron Tomlin static const struct symsearch arr[] = { 305cfc1d277SAaron Tomlin { __start___ksymtab, __stop___ksymtab, __start___kcrctab, 306cfc1d277SAaron Tomlin NOT_GPL_ONLY }, 307cfc1d277SAaron Tomlin { __start___ksymtab_gpl, __stop___ksymtab_gpl, 308cfc1d277SAaron Tomlin __start___kcrctab_gpl, 309cfc1d277SAaron Tomlin GPL_ONLY }, 310cfc1d277SAaron Tomlin }; 311cfc1d277SAaron Tomlin struct module *mod; 312cfc1d277SAaron Tomlin unsigned int i; 313cfc1d277SAaron Tomlin 314cfc1d277SAaron Tomlin module_assert_mutex_or_preempt(); 315cfc1d277SAaron Tomlin 316cfc1d277SAaron Tomlin for (i = 0; i < ARRAY_SIZE(arr); i++) 317cfc1d277SAaron Tomlin if (find_exported_symbol_in_section(&arr[i], NULL, fsa)) 318cfc1d277SAaron Tomlin return true; 319cfc1d277SAaron Tomlin 320cfc1d277SAaron Tomlin list_for_each_entry_rcu(mod, &modules, list, 321cfc1d277SAaron Tomlin lockdep_is_held(&module_mutex)) { 322cfc1d277SAaron Tomlin struct symsearch arr[] = { 323cfc1d277SAaron Tomlin { mod->syms, mod->syms + mod->num_syms, mod->crcs, 324cfc1d277SAaron Tomlin NOT_GPL_ONLY }, 325cfc1d277SAaron Tomlin { mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms, 326cfc1d277SAaron Tomlin mod->gpl_crcs, 327cfc1d277SAaron Tomlin GPL_ONLY }, 328cfc1d277SAaron Tomlin }; 329cfc1d277SAaron Tomlin 330cfc1d277SAaron Tomlin if (mod->state == MODULE_STATE_UNFORMED) 331cfc1d277SAaron Tomlin continue; 332cfc1d277SAaron Tomlin 333cfc1d277SAaron Tomlin for (i = 0; i < ARRAY_SIZE(arr); i++) 334cfc1d277SAaron Tomlin if (find_exported_symbol_in_section(&arr[i], mod, fsa)) 335cfc1d277SAaron Tomlin return true; 336cfc1d277SAaron Tomlin } 337cfc1d277SAaron Tomlin 338cfc1d277SAaron Tomlin pr_debug("Failed to find symbol %s\n", fsa->name); 339cfc1d277SAaron Tomlin return false; 340cfc1d277SAaron Tomlin } 341cfc1d277SAaron Tomlin 342cfc1d277SAaron Tomlin /* 343cfc1d277SAaron Tomlin * Search for module by name: must hold module_mutex (or preempt disabled 344cfc1d277SAaron Tomlin * for read-only access). 345cfc1d277SAaron Tomlin */ 34691fb02f3SAaron Tomlin struct module *find_module_all(const char *name, size_t len, 347cfc1d277SAaron Tomlin bool even_unformed) 348cfc1d277SAaron Tomlin { 349cfc1d277SAaron Tomlin struct module *mod; 350cfc1d277SAaron Tomlin 351cfc1d277SAaron Tomlin module_assert_mutex_or_preempt(); 352cfc1d277SAaron Tomlin 353cfc1d277SAaron Tomlin list_for_each_entry_rcu(mod, &modules, list, 354cfc1d277SAaron Tomlin lockdep_is_held(&module_mutex)) { 355cfc1d277SAaron Tomlin if (!even_unformed && mod->state == MODULE_STATE_UNFORMED) 356cfc1d277SAaron Tomlin continue; 357cfc1d277SAaron Tomlin if (strlen(mod->name) == len && !memcmp(mod->name, name, len)) 358cfc1d277SAaron Tomlin return mod; 359cfc1d277SAaron Tomlin } 360cfc1d277SAaron Tomlin return NULL; 361cfc1d277SAaron Tomlin } 362cfc1d277SAaron Tomlin 363cfc1d277SAaron Tomlin struct module *find_module(const char *name) 364cfc1d277SAaron Tomlin { 365cfc1d277SAaron Tomlin return find_module_all(name, strlen(name), false); 366cfc1d277SAaron Tomlin } 367cfc1d277SAaron Tomlin 368cfc1d277SAaron Tomlin #ifdef CONFIG_SMP 369cfc1d277SAaron Tomlin 370cfc1d277SAaron Tomlin static inline void __percpu *mod_percpu(struct module *mod) 371cfc1d277SAaron Tomlin { 372cfc1d277SAaron Tomlin return mod->percpu; 373cfc1d277SAaron Tomlin } 374cfc1d277SAaron Tomlin 375cfc1d277SAaron Tomlin static int percpu_modalloc(struct module *mod, struct load_info *info) 376cfc1d277SAaron Tomlin { 377cfc1d277SAaron Tomlin Elf_Shdr *pcpusec = &info->sechdrs[info->index.pcpu]; 378cfc1d277SAaron Tomlin unsigned long align = pcpusec->sh_addralign; 379cfc1d277SAaron Tomlin 380cfc1d277SAaron Tomlin if (!pcpusec->sh_size) 381cfc1d277SAaron Tomlin return 0; 382cfc1d277SAaron Tomlin 383cfc1d277SAaron Tomlin if (align > PAGE_SIZE) { 384cfc1d277SAaron Tomlin pr_warn("%s: per-cpu alignment %li > %li\n", 385cfc1d277SAaron Tomlin mod->name, align, PAGE_SIZE); 386cfc1d277SAaron Tomlin align = PAGE_SIZE; 387cfc1d277SAaron Tomlin } 388cfc1d277SAaron Tomlin 389cfc1d277SAaron Tomlin mod->percpu = __alloc_reserved_percpu(pcpusec->sh_size, align); 390cfc1d277SAaron Tomlin if (!mod->percpu) { 391cfc1d277SAaron Tomlin pr_warn("%s: Could not allocate %lu bytes percpu data\n", 392cfc1d277SAaron Tomlin mod->name, (unsigned long)pcpusec->sh_size); 393cfc1d277SAaron Tomlin return -ENOMEM; 394cfc1d277SAaron Tomlin } 395cfc1d277SAaron Tomlin mod->percpu_size = pcpusec->sh_size; 396cfc1d277SAaron Tomlin return 0; 397cfc1d277SAaron Tomlin } 398cfc1d277SAaron Tomlin 399cfc1d277SAaron Tomlin static void percpu_modfree(struct module *mod) 400cfc1d277SAaron Tomlin { 401cfc1d277SAaron Tomlin free_percpu(mod->percpu); 402cfc1d277SAaron Tomlin } 403cfc1d277SAaron Tomlin 404cfc1d277SAaron Tomlin static unsigned int find_pcpusec(struct load_info *info) 405cfc1d277SAaron Tomlin { 406cfc1d277SAaron Tomlin return find_sec(info, ".data..percpu"); 407cfc1d277SAaron Tomlin } 408cfc1d277SAaron Tomlin 409cfc1d277SAaron Tomlin static void percpu_modcopy(struct module *mod, 410cfc1d277SAaron Tomlin const void *from, unsigned long size) 411cfc1d277SAaron Tomlin { 412cfc1d277SAaron Tomlin int cpu; 413cfc1d277SAaron Tomlin 414cfc1d277SAaron Tomlin for_each_possible_cpu(cpu) 415cfc1d277SAaron Tomlin memcpy(per_cpu_ptr(mod->percpu, cpu), from, size); 416cfc1d277SAaron Tomlin } 417cfc1d277SAaron Tomlin 418cfc1d277SAaron Tomlin bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr) 419cfc1d277SAaron Tomlin { 420cfc1d277SAaron Tomlin struct module *mod; 421cfc1d277SAaron Tomlin unsigned int cpu; 422cfc1d277SAaron Tomlin 423cfc1d277SAaron Tomlin preempt_disable(); 424cfc1d277SAaron Tomlin 425cfc1d277SAaron Tomlin list_for_each_entry_rcu(mod, &modules, list) { 426cfc1d277SAaron Tomlin if (mod->state == MODULE_STATE_UNFORMED) 427cfc1d277SAaron Tomlin continue; 428cfc1d277SAaron Tomlin if (!mod->percpu_size) 429cfc1d277SAaron Tomlin continue; 430cfc1d277SAaron Tomlin for_each_possible_cpu(cpu) { 431cfc1d277SAaron Tomlin void *start = per_cpu_ptr(mod->percpu, cpu); 432cfc1d277SAaron Tomlin void *va = (void *)addr; 433cfc1d277SAaron Tomlin 434cfc1d277SAaron Tomlin if (va >= start && va < start + mod->percpu_size) { 435cfc1d277SAaron Tomlin if (can_addr) { 436cfc1d277SAaron Tomlin *can_addr = (unsigned long) (va - start); 437cfc1d277SAaron Tomlin *can_addr += (unsigned long) 438cfc1d277SAaron Tomlin per_cpu_ptr(mod->percpu, 439cfc1d277SAaron Tomlin get_boot_cpu_id()); 440cfc1d277SAaron Tomlin } 441cfc1d277SAaron Tomlin preempt_enable(); 442cfc1d277SAaron Tomlin return true; 443cfc1d277SAaron Tomlin } 444cfc1d277SAaron Tomlin } 445cfc1d277SAaron Tomlin } 446cfc1d277SAaron Tomlin 447cfc1d277SAaron Tomlin preempt_enable(); 448cfc1d277SAaron Tomlin return false; 449cfc1d277SAaron Tomlin } 450cfc1d277SAaron Tomlin 451cfc1d277SAaron Tomlin /** 452cfc1d277SAaron Tomlin * is_module_percpu_address() - test whether address is from module static percpu 453cfc1d277SAaron Tomlin * @addr: address to test 454cfc1d277SAaron Tomlin * 455cfc1d277SAaron Tomlin * Test whether @addr belongs to module static percpu area. 456cfc1d277SAaron Tomlin * 457cfc1d277SAaron Tomlin * Return: %true if @addr is from module static percpu area 458cfc1d277SAaron Tomlin */ 459cfc1d277SAaron Tomlin bool is_module_percpu_address(unsigned long addr) 460cfc1d277SAaron Tomlin { 461cfc1d277SAaron Tomlin return __is_module_percpu_address(addr, NULL); 462cfc1d277SAaron Tomlin } 463cfc1d277SAaron Tomlin 464cfc1d277SAaron Tomlin #else /* ... !CONFIG_SMP */ 465cfc1d277SAaron Tomlin 466cfc1d277SAaron Tomlin static inline void __percpu *mod_percpu(struct module *mod) 467cfc1d277SAaron Tomlin { 468cfc1d277SAaron Tomlin return NULL; 469cfc1d277SAaron Tomlin } 470cfc1d277SAaron Tomlin static int percpu_modalloc(struct module *mod, struct load_info *info) 471cfc1d277SAaron Tomlin { 472cfc1d277SAaron Tomlin /* UP modules shouldn't have this section: ENOMEM isn't quite right */ 473cfc1d277SAaron Tomlin if (info->sechdrs[info->index.pcpu].sh_size != 0) 474cfc1d277SAaron Tomlin return -ENOMEM; 475cfc1d277SAaron Tomlin return 0; 476cfc1d277SAaron Tomlin } 477cfc1d277SAaron Tomlin static inline void percpu_modfree(struct module *mod) 478cfc1d277SAaron Tomlin { 479cfc1d277SAaron Tomlin } 480cfc1d277SAaron Tomlin static unsigned int find_pcpusec(struct load_info *info) 481cfc1d277SAaron Tomlin { 482cfc1d277SAaron Tomlin return 0; 483cfc1d277SAaron Tomlin } 484cfc1d277SAaron Tomlin static inline void percpu_modcopy(struct module *mod, 485cfc1d277SAaron Tomlin const void *from, unsigned long size) 486cfc1d277SAaron Tomlin { 487cfc1d277SAaron Tomlin /* pcpusec should be 0, and size of that section should be 0. */ 488cfc1d277SAaron Tomlin BUG_ON(size != 0); 489cfc1d277SAaron Tomlin } 490cfc1d277SAaron Tomlin bool is_module_percpu_address(unsigned long addr) 491cfc1d277SAaron Tomlin { 492cfc1d277SAaron Tomlin return false; 493cfc1d277SAaron Tomlin } 494cfc1d277SAaron Tomlin 495cfc1d277SAaron Tomlin bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr) 496cfc1d277SAaron Tomlin { 497cfc1d277SAaron Tomlin return false; 498cfc1d277SAaron Tomlin } 499cfc1d277SAaron Tomlin 500cfc1d277SAaron Tomlin #endif /* CONFIG_SMP */ 501cfc1d277SAaron Tomlin 502cfc1d277SAaron Tomlin #define MODINFO_ATTR(field) \ 503cfc1d277SAaron Tomlin static void setup_modinfo_##field(struct module *mod, const char *s) \ 504cfc1d277SAaron Tomlin { \ 505cfc1d277SAaron Tomlin mod->field = kstrdup(s, GFP_KERNEL); \ 506cfc1d277SAaron Tomlin } \ 507cfc1d277SAaron Tomlin static ssize_t show_modinfo_##field(struct module_attribute *mattr, \ 508cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) \ 509cfc1d277SAaron Tomlin { \ 510cfc1d277SAaron Tomlin return scnprintf(buffer, PAGE_SIZE, "%s\n", mk->mod->field); \ 511cfc1d277SAaron Tomlin } \ 512cfc1d277SAaron Tomlin static int modinfo_##field##_exists(struct module *mod) \ 513cfc1d277SAaron Tomlin { \ 514cfc1d277SAaron Tomlin return mod->field != NULL; \ 515cfc1d277SAaron Tomlin } \ 516cfc1d277SAaron Tomlin static void free_modinfo_##field(struct module *mod) \ 517cfc1d277SAaron Tomlin { \ 518cfc1d277SAaron Tomlin kfree(mod->field); \ 519cfc1d277SAaron Tomlin mod->field = NULL; \ 520cfc1d277SAaron Tomlin } \ 521cfc1d277SAaron Tomlin static struct module_attribute modinfo_##field = { \ 522cfc1d277SAaron Tomlin .attr = { .name = __stringify(field), .mode = 0444 }, \ 523cfc1d277SAaron Tomlin .show = show_modinfo_##field, \ 524cfc1d277SAaron Tomlin .setup = setup_modinfo_##field, \ 525cfc1d277SAaron Tomlin .test = modinfo_##field##_exists, \ 526cfc1d277SAaron Tomlin .free = free_modinfo_##field, \ 527cfc1d277SAaron Tomlin }; 528cfc1d277SAaron Tomlin 529cfc1d277SAaron Tomlin MODINFO_ATTR(version); 530cfc1d277SAaron Tomlin MODINFO_ATTR(srcversion); 531cfc1d277SAaron Tomlin 5326f1dae1dSAaron Tomlin static struct { 5336f1dae1dSAaron Tomlin char name[MODULE_NAME_LEN + 1]; 5346f1dae1dSAaron Tomlin char taints[MODULE_FLAGS_BUF_SIZE]; 5356f1dae1dSAaron Tomlin } last_unloaded_module; 536cfc1d277SAaron Tomlin 537cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_UNLOAD 538cfc1d277SAaron Tomlin 539cfc1d277SAaron Tomlin EXPORT_TRACEPOINT_SYMBOL(module_get); 540cfc1d277SAaron Tomlin 541cfc1d277SAaron Tomlin /* MODULE_REF_BASE is the base reference count by kmodule loader. */ 542cfc1d277SAaron Tomlin #define MODULE_REF_BASE 1 543cfc1d277SAaron Tomlin 544cfc1d277SAaron Tomlin /* Init the unload section of the module. */ 545cfc1d277SAaron Tomlin static int module_unload_init(struct module *mod) 546cfc1d277SAaron Tomlin { 547cfc1d277SAaron Tomlin /* 548cfc1d277SAaron Tomlin * Initialize reference counter to MODULE_REF_BASE. 549cfc1d277SAaron Tomlin * refcnt == 0 means module is going. 550cfc1d277SAaron Tomlin */ 551cfc1d277SAaron Tomlin atomic_set(&mod->refcnt, MODULE_REF_BASE); 552cfc1d277SAaron Tomlin 553cfc1d277SAaron Tomlin INIT_LIST_HEAD(&mod->source_list); 554cfc1d277SAaron Tomlin INIT_LIST_HEAD(&mod->target_list); 555cfc1d277SAaron Tomlin 556cfc1d277SAaron Tomlin /* Hold reference count during initialization. */ 557cfc1d277SAaron Tomlin atomic_inc(&mod->refcnt); 558cfc1d277SAaron Tomlin 559cfc1d277SAaron Tomlin return 0; 560cfc1d277SAaron Tomlin } 561cfc1d277SAaron Tomlin 562cfc1d277SAaron Tomlin /* Does a already use b? */ 563cfc1d277SAaron Tomlin static int already_uses(struct module *a, struct module *b) 564cfc1d277SAaron Tomlin { 565cfc1d277SAaron Tomlin struct module_use *use; 566cfc1d277SAaron Tomlin 567cfc1d277SAaron Tomlin list_for_each_entry(use, &b->source_list, source_list) { 56833c951f6SJim Cromie if (use->source == a) 569cfc1d277SAaron Tomlin return 1; 570cfc1d277SAaron Tomlin } 571cfc1d277SAaron Tomlin pr_debug("%s does not use %s!\n", a->name, b->name); 572cfc1d277SAaron Tomlin return 0; 573cfc1d277SAaron Tomlin } 574cfc1d277SAaron Tomlin 575cfc1d277SAaron Tomlin /* 576cfc1d277SAaron Tomlin * Module a uses b 577cfc1d277SAaron Tomlin * - we add 'a' as a "source", 'b' as a "target" of module use 578cfc1d277SAaron Tomlin * - the module_use is added to the list of 'b' sources (so 579cfc1d277SAaron Tomlin * 'b' can walk the list to see who sourced them), and of 'a' 580cfc1d277SAaron Tomlin * targets (so 'a' can see what modules it targets). 581cfc1d277SAaron Tomlin */ 582cfc1d277SAaron Tomlin static int add_module_usage(struct module *a, struct module *b) 583cfc1d277SAaron Tomlin { 584cfc1d277SAaron Tomlin struct module_use *use; 585cfc1d277SAaron Tomlin 586cfc1d277SAaron Tomlin pr_debug("Allocating new usage for %s.\n", a->name); 587cfc1d277SAaron Tomlin use = kmalloc(sizeof(*use), GFP_ATOMIC); 588cfc1d277SAaron Tomlin if (!use) 589cfc1d277SAaron Tomlin return -ENOMEM; 590cfc1d277SAaron Tomlin 591cfc1d277SAaron Tomlin use->source = a; 592cfc1d277SAaron Tomlin use->target = b; 593cfc1d277SAaron Tomlin list_add(&use->source_list, &b->source_list); 594cfc1d277SAaron Tomlin list_add(&use->target_list, &a->target_list); 595cfc1d277SAaron Tomlin return 0; 596cfc1d277SAaron Tomlin } 597cfc1d277SAaron Tomlin 598cfc1d277SAaron Tomlin /* Module a uses b: caller needs module_mutex() */ 599cfc1d277SAaron Tomlin static int ref_module(struct module *a, struct module *b) 600cfc1d277SAaron Tomlin { 601cfc1d277SAaron Tomlin int err; 602cfc1d277SAaron Tomlin 603cfc1d277SAaron Tomlin if (b == NULL || already_uses(a, b)) 604cfc1d277SAaron Tomlin return 0; 605cfc1d277SAaron Tomlin 606cfc1d277SAaron Tomlin /* If module isn't available, we fail. */ 607cfc1d277SAaron Tomlin err = strong_try_module_get(b); 608cfc1d277SAaron Tomlin if (err) 609cfc1d277SAaron Tomlin return err; 610cfc1d277SAaron Tomlin 611cfc1d277SAaron Tomlin err = add_module_usage(a, b); 612cfc1d277SAaron Tomlin if (err) { 613cfc1d277SAaron Tomlin module_put(b); 614cfc1d277SAaron Tomlin return err; 615cfc1d277SAaron Tomlin } 616cfc1d277SAaron Tomlin return 0; 617cfc1d277SAaron Tomlin } 618cfc1d277SAaron Tomlin 619cfc1d277SAaron Tomlin /* Clear the unload stuff of the module. */ 620cfc1d277SAaron Tomlin static void module_unload_free(struct module *mod) 621cfc1d277SAaron Tomlin { 622cfc1d277SAaron Tomlin struct module_use *use, *tmp; 623cfc1d277SAaron Tomlin 624cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 625cfc1d277SAaron Tomlin list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) { 626cfc1d277SAaron Tomlin struct module *i = use->target; 627cfc1d277SAaron Tomlin pr_debug("%s unusing %s\n", mod->name, i->name); 628cfc1d277SAaron Tomlin module_put(i); 629cfc1d277SAaron Tomlin list_del(&use->source_list); 630cfc1d277SAaron Tomlin list_del(&use->target_list); 631cfc1d277SAaron Tomlin kfree(use); 632cfc1d277SAaron Tomlin } 633cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 634cfc1d277SAaron Tomlin } 635cfc1d277SAaron Tomlin 636cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_FORCE_UNLOAD 637cfc1d277SAaron Tomlin static inline int try_force_unload(unsigned int flags) 638cfc1d277SAaron Tomlin { 639cfc1d277SAaron Tomlin int ret = (flags & O_TRUNC); 640cfc1d277SAaron Tomlin if (ret) 641cfc1d277SAaron Tomlin add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE); 642cfc1d277SAaron Tomlin return ret; 643cfc1d277SAaron Tomlin } 644cfc1d277SAaron Tomlin #else 645cfc1d277SAaron Tomlin static inline int try_force_unload(unsigned int flags) 646cfc1d277SAaron Tomlin { 647cfc1d277SAaron Tomlin return 0; 648cfc1d277SAaron Tomlin } 649cfc1d277SAaron Tomlin #endif /* CONFIG_MODULE_FORCE_UNLOAD */ 650cfc1d277SAaron Tomlin 651cfc1d277SAaron Tomlin /* Try to release refcount of module, 0 means success. */ 652cfc1d277SAaron Tomlin static int try_release_module_ref(struct module *mod) 653cfc1d277SAaron Tomlin { 654cfc1d277SAaron Tomlin int ret; 655cfc1d277SAaron Tomlin 656cfc1d277SAaron Tomlin /* Try to decrement refcnt which we set at loading */ 657cfc1d277SAaron Tomlin ret = atomic_sub_return(MODULE_REF_BASE, &mod->refcnt); 658cfc1d277SAaron Tomlin BUG_ON(ret < 0); 659cfc1d277SAaron Tomlin if (ret) 660cfc1d277SAaron Tomlin /* Someone can put this right now, recover with checking */ 661cfc1d277SAaron Tomlin ret = atomic_add_unless(&mod->refcnt, MODULE_REF_BASE, 0); 662cfc1d277SAaron Tomlin 663cfc1d277SAaron Tomlin return ret; 664cfc1d277SAaron Tomlin } 665cfc1d277SAaron Tomlin 666cfc1d277SAaron Tomlin static int try_stop_module(struct module *mod, int flags, int *forced) 667cfc1d277SAaron Tomlin { 668cfc1d277SAaron Tomlin /* If it's not unused, quit unless we're forcing. */ 669cfc1d277SAaron Tomlin if (try_release_module_ref(mod) != 0) { 670cfc1d277SAaron Tomlin *forced = try_force_unload(flags); 671cfc1d277SAaron Tomlin if (!(*forced)) 672cfc1d277SAaron Tomlin return -EWOULDBLOCK; 673cfc1d277SAaron Tomlin } 674cfc1d277SAaron Tomlin 675cfc1d277SAaron Tomlin /* Mark it as dying. */ 676cfc1d277SAaron Tomlin mod->state = MODULE_STATE_GOING; 677cfc1d277SAaron Tomlin 678cfc1d277SAaron Tomlin return 0; 679cfc1d277SAaron Tomlin } 680cfc1d277SAaron Tomlin 681cfc1d277SAaron Tomlin /** 682cfc1d277SAaron Tomlin * module_refcount() - return the refcount or -1 if unloading 683cfc1d277SAaron Tomlin * @mod: the module we're checking 684cfc1d277SAaron Tomlin * 685cfc1d277SAaron Tomlin * Return: 686cfc1d277SAaron Tomlin * -1 if the module is in the process of unloading 687cfc1d277SAaron Tomlin * otherwise the number of references in the kernel to the module 688cfc1d277SAaron Tomlin */ 689cfc1d277SAaron Tomlin int module_refcount(struct module *mod) 690cfc1d277SAaron Tomlin { 691cfc1d277SAaron Tomlin return atomic_read(&mod->refcnt) - MODULE_REF_BASE; 692cfc1d277SAaron Tomlin } 693cfc1d277SAaron Tomlin EXPORT_SYMBOL(module_refcount); 694cfc1d277SAaron Tomlin 695cfc1d277SAaron Tomlin /* This exists whether we can unload or not */ 696cfc1d277SAaron Tomlin static void free_module(struct module *mod); 697cfc1d277SAaron Tomlin 698cfc1d277SAaron Tomlin SYSCALL_DEFINE2(delete_module, const char __user *, name_user, 699cfc1d277SAaron Tomlin unsigned int, flags) 700cfc1d277SAaron Tomlin { 701cfc1d277SAaron Tomlin struct module *mod; 702cfc1d277SAaron Tomlin char name[MODULE_NAME_LEN]; 7036f1dae1dSAaron Tomlin char buf[MODULE_FLAGS_BUF_SIZE]; 704cfc1d277SAaron Tomlin int ret, forced = 0; 705cfc1d277SAaron Tomlin 706cfc1d277SAaron Tomlin if (!capable(CAP_SYS_MODULE) || modules_disabled) 707cfc1d277SAaron Tomlin return -EPERM; 708cfc1d277SAaron Tomlin 709cfc1d277SAaron Tomlin if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) 710cfc1d277SAaron Tomlin return -EFAULT; 711cfc1d277SAaron Tomlin name[MODULE_NAME_LEN-1] = '\0'; 712cfc1d277SAaron Tomlin 713cfc1d277SAaron Tomlin audit_log_kern_module(name); 714cfc1d277SAaron Tomlin 715cfc1d277SAaron Tomlin if (mutex_lock_interruptible(&module_mutex) != 0) 716cfc1d277SAaron Tomlin return -EINTR; 717cfc1d277SAaron Tomlin 718cfc1d277SAaron Tomlin mod = find_module(name); 719cfc1d277SAaron Tomlin if (!mod) { 720cfc1d277SAaron Tomlin ret = -ENOENT; 721cfc1d277SAaron Tomlin goto out; 722cfc1d277SAaron Tomlin } 723cfc1d277SAaron Tomlin 724cfc1d277SAaron Tomlin if (!list_empty(&mod->source_list)) { 725cfc1d277SAaron Tomlin /* Other modules depend on us: get rid of them first. */ 726cfc1d277SAaron Tomlin ret = -EWOULDBLOCK; 727cfc1d277SAaron Tomlin goto out; 728cfc1d277SAaron Tomlin } 729cfc1d277SAaron Tomlin 730cfc1d277SAaron Tomlin /* Doing init or already dying? */ 731cfc1d277SAaron Tomlin if (mod->state != MODULE_STATE_LIVE) { 732cfc1d277SAaron Tomlin /* FIXME: if (force), slam module count damn the torpedoes */ 733cfc1d277SAaron Tomlin pr_debug("%s already dying\n", mod->name); 734cfc1d277SAaron Tomlin ret = -EBUSY; 735cfc1d277SAaron Tomlin goto out; 736cfc1d277SAaron Tomlin } 737cfc1d277SAaron Tomlin 738cfc1d277SAaron Tomlin /* If it has an init func, it must have an exit func to unload */ 739cfc1d277SAaron Tomlin if (mod->init && !mod->exit) { 740cfc1d277SAaron Tomlin forced = try_force_unload(flags); 741cfc1d277SAaron Tomlin if (!forced) { 742cfc1d277SAaron Tomlin /* This module can't be removed */ 743cfc1d277SAaron Tomlin ret = -EBUSY; 744cfc1d277SAaron Tomlin goto out; 745cfc1d277SAaron Tomlin } 746cfc1d277SAaron Tomlin } 747cfc1d277SAaron Tomlin 748cfc1d277SAaron Tomlin ret = try_stop_module(mod, flags, &forced); 749cfc1d277SAaron Tomlin if (ret != 0) 750cfc1d277SAaron Tomlin goto out; 751cfc1d277SAaron Tomlin 752cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 753cfc1d277SAaron Tomlin /* Final destruction now no one is using it. */ 754cfc1d277SAaron Tomlin if (mod->exit != NULL) 755cfc1d277SAaron Tomlin mod->exit(); 756cfc1d277SAaron Tomlin blocking_notifier_call_chain(&module_notify_list, 757cfc1d277SAaron Tomlin MODULE_STATE_GOING, mod); 758cfc1d277SAaron Tomlin klp_module_going(mod); 759cfc1d277SAaron Tomlin ftrace_release_mod(mod); 760cfc1d277SAaron Tomlin 761cfc1d277SAaron Tomlin async_synchronize_full(); 762cfc1d277SAaron Tomlin 7636f1dae1dSAaron Tomlin /* Store the name and taints of the last unloaded module for diagnostic purposes */ 7646f1dae1dSAaron Tomlin strscpy(last_unloaded_module.name, mod->name, sizeof(last_unloaded_module.name)); 7656f1dae1dSAaron Tomlin strscpy(last_unloaded_module.taints, module_flags(mod, buf, false), sizeof(last_unloaded_module.taints)); 766cfc1d277SAaron Tomlin 767cfc1d277SAaron Tomlin free_module(mod); 768cfc1d277SAaron Tomlin /* someone could wait for the module in add_unformed_module() */ 769cfc1d277SAaron Tomlin wake_up_all(&module_wq); 770cfc1d277SAaron Tomlin return 0; 771cfc1d277SAaron Tomlin out: 772cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 773cfc1d277SAaron Tomlin return ret; 774cfc1d277SAaron Tomlin } 775cfc1d277SAaron Tomlin 776cfc1d277SAaron Tomlin void __symbol_put(const char *symbol) 777cfc1d277SAaron Tomlin { 778cfc1d277SAaron Tomlin struct find_symbol_arg fsa = { 779cfc1d277SAaron Tomlin .name = symbol, 780cfc1d277SAaron Tomlin .gplok = true, 781cfc1d277SAaron Tomlin }; 782cfc1d277SAaron Tomlin 783cfc1d277SAaron Tomlin preempt_disable(); 784cfc1d277SAaron Tomlin BUG_ON(!find_symbol(&fsa)); 785cfc1d277SAaron Tomlin module_put(fsa.owner); 786cfc1d277SAaron Tomlin preempt_enable(); 787cfc1d277SAaron Tomlin } 788cfc1d277SAaron Tomlin EXPORT_SYMBOL(__symbol_put); 789cfc1d277SAaron Tomlin 790cfc1d277SAaron Tomlin /* Note this assumes addr is a function, which it currently always is. */ 791cfc1d277SAaron Tomlin void symbol_put_addr(void *addr) 792cfc1d277SAaron Tomlin { 793cfc1d277SAaron Tomlin struct module *modaddr; 794cfc1d277SAaron Tomlin unsigned long a = (unsigned long)dereference_function_descriptor(addr); 795cfc1d277SAaron Tomlin 796cfc1d277SAaron Tomlin if (core_kernel_text(a)) 797cfc1d277SAaron Tomlin return; 798cfc1d277SAaron Tomlin 799cfc1d277SAaron Tomlin /* 800cfc1d277SAaron Tomlin * Even though we hold a reference on the module; we still need to 801cfc1d277SAaron Tomlin * disable preemption in order to safely traverse the data structure. 802cfc1d277SAaron Tomlin */ 803cfc1d277SAaron Tomlin preempt_disable(); 804cfc1d277SAaron Tomlin modaddr = __module_text_address(a); 805cfc1d277SAaron Tomlin BUG_ON(!modaddr); 806cfc1d277SAaron Tomlin module_put(modaddr); 807cfc1d277SAaron Tomlin preempt_enable(); 808cfc1d277SAaron Tomlin } 809cfc1d277SAaron Tomlin EXPORT_SYMBOL_GPL(symbol_put_addr); 810cfc1d277SAaron Tomlin 811cfc1d277SAaron Tomlin static ssize_t show_refcnt(struct module_attribute *mattr, 812cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) 813cfc1d277SAaron Tomlin { 814cfc1d277SAaron Tomlin return sprintf(buffer, "%i\n", module_refcount(mk->mod)); 815cfc1d277SAaron Tomlin } 816cfc1d277SAaron Tomlin 817cfc1d277SAaron Tomlin static struct module_attribute modinfo_refcnt = 818cfc1d277SAaron Tomlin __ATTR(refcnt, 0444, show_refcnt, NULL); 819cfc1d277SAaron Tomlin 820cfc1d277SAaron Tomlin void __module_get(struct module *module) 821cfc1d277SAaron Tomlin { 822cfc1d277SAaron Tomlin if (module) { 823cfc1d277SAaron Tomlin atomic_inc(&module->refcnt); 824cfc1d277SAaron Tomlin trace_module_get(module, _RET_IP_); 825cfc1d277SAaron Tomlin } 826cfc1d277SAaron Tomlin } 827cfc1d277SAaron Tomlin EXPORT_SYMBOL(__module_get); 828cfc1d277SAaron Tomlin 829cfc1d277SAaron Tomlin bool try_module_get(struct module *module) 830cfc1d277SAaron Tomlin { 831cfc1d277SAaron Tomlin bool ret = true; 832cfc1d277SAaron Tomlin 833cfc1d277SAaron Tomlin if (module) { 834cfc1d277SAaron Tomlin /* Note: here, we can fail to get a reference */ 835cfc1d277SAaron Tomlin if (likely(module_is_live(module) && 836cfc1d277SAaron Tomlin atomic_inc_not_zero(&module->refcnt) != 0)) 837cfc1d277SAaron Tomlin trace_module_get(module, _RET_IP_); 838cfc1d277SAaron Tomlin else 839cfc1d277SAaron Tomlin ret = false; 840cfc1d277SAaron Tomlin } 841cfc1d277SAaron Tomlin return ret; 842cfc1d277SAaron Tomlin } 843cfc1d277SAaron Tomlin EXPORT_SYMBOL(try_module_get); 844cfc1d277SAaron Tomlin 845cfc1d277SAaron Tomlin void module_put(struct module *module) 846cfc1d277SAaron Tomlin { 847cfc1d277SAaron Tomlin int ret; 848cfc1d277SAaron Tomlin 849cfc1d277SAaron Tomlin if (module) { 850cfc1d277SAaron Tomlin ret = atomic_dec_if_positive(&module->refcnt); 851cfc1d277SAaron Tomlin WARN_ON(ret < 0); /* Failed to put refcount */ 852cfc1d277SAaron Tomlin trace_module_put(module, _RET_IP_); 853cfc1d277SAaron Tomlin } 854cfc1d277SAaron Tomlin } 855cfc1d277SAaron Tomlin EXPORT_SYMBOL(module_put); 856cfc1d277SAaron Tomlin 857cfc1d277SAaron Tomlin #else /* !CONFIG_MODULE_UNLOAD */ 858cfc1d277SAaron Tomlin static inline void module_unload_free(struct module *mod) 859cfc1d277SAaron Tomlin { 860cfc1d277SAaron Tomlin } 861cfc1d277SAaron Tomlin 862cfc1d277SAaron Tomlin static int ref_module(struct module *a, struct module *b) 863cfc1d277SAaron Tomlin { 864cfc1d277SAaron Tomlin return strong_try_module_get(b); 865cfc1d277SAaron Tomlin } 866cfc1d277SAaron Tomlin 867cfc1d277SAaron Tomlin static inline int module_unload_init(struct module *mod) 868cfc1d277SAaron Tomlin { 869cfc1d277SAaron Tomlin return 0; 870cfc1d277SAaron Tomlin } 871cfc1d277SAaron Tomlin #endif /* CONFIG_MODULE_UNLOAD */ 872cfc1d277SAaron Tomlin 873c14e522bSAaron Tomlin size_t module_flags_taint(unsigned long taints, char *buf) 874cfc1d277SAaron Tomlin { 875cfc1d277SAaron Tomlin size_t l = 0; 876cfc1d277SAaron Tomlin int i; 877cfc1d277SAaron Tomlin 878cfc1d277SAaron Tomlin for (i = 0; i < TAINT_FLAGS_COUNT; i++) { 879c14e522bSAaron Tomlin if (taint_flags[i].module && test_bit(i, &taints)) 880cfc1d277SAaron Tomlin buf[l++] = taint_flags[i].c_true; 881cfc1d277SAaron Tomlin } 882cfc1d277SAaron Tomlin 883cfc1d277SAaron Tomlin return l; 884cfc1d277SAaron Tomlin } 885cfc1d277SAaron Tomlin 886cfc1d277SAaron Tomlin static ssize_t show_initstate(struct module_attribute *mattr, 887cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) 888cfc1d277SAaron Tomlin { 889cfc1d277SAaron Tomlin const char *state = "unknown"; 890cfc1d277SAaron Tomlin 891cfc1d277SAaron Tomlin switch (mk->mod->state) { 892cfc1d277SAaron Tomlin case MODULE_STATE_LIVE: 893cfc1d277SAaron Tomlin state = "live"; 894cfc1d277SAaron Tomlin break; 895cfc1d277SAaron Tomlin case MODULE_STATE_COMING: 896cfc1d277SAaron Tomlin state = "coming"; 897cfc1d277SAaron Tomlin break; 898cfc1d277SAaron Tomlin case MODULE_STATE_GOING: 899cfc1d277SAaron Tomlin state = "going"; 900cfc1d277SAaron Tomlin break; 901cfc1d277SAaron Tomlin default: 902cfc1d277SAaron Tomlin BUG(); 903cfc1d277SAaron Tomlin } 904cfc1d277SAaron Tomlin return sprintf(buffer, "%s\n", state); 905cfc1d277SAaron Tomlin } 906cfc1d277SAaron Tomlin 907cfc1d277SAaron Tomlin static struct module_attribute modinfo_initstate = 908cfc1d277SAaron Tomlin __ATTR(initstate, 0444, show_initstate, NULL); 909cfc1d277SAaron Tomlin 910cfc1d277SAaron Tomlin static ssize_t store_uevent(struct module_attribute *mattr, 911cfc1d277SAaron Tomlin struct module_kobject *mk, 912cfc1d277SAaron Tomlin const char *buffer, size_t count) 913cfc1d277SAaron Tomlin { 914cfc1d277SAaron Tomlin int rc; 915cfc1d277SAaron Tomlin 916cfc1d277SAaron Tomlin rc = kobject_synth_uevent(&mk->kobj, buffer, count); 917cfc1d277SAaron Tomlin return rc ? rc : count; 918cfc1d277SAaron Tomlin } 919cfc1d277SAaron Tomlin 920cfc1d277SAaron Tomlin struct module_attribute module_uevent = 921cfc1d277SAaron Tomlin __ATTR(uevent, 0200, NULL, store_uevent); 922cfc1d277SAaron Tomlin 923cfc1d277SAaron Tomlin static ssize_t show_coresize(struct module_attribute *mattr, 924cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) 925cfc1d277SAaron Tomlin { 926ac3b4328SSong Liu unsigned int size = mk->mod->mem[MOD_TEXT].size; 927ac3b4328SSong Liu 928ac3b4328SSong Liu if (!IS_ENABLED(CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC)) { 929ac3b4328SSong Liu for_class_mod_mem_type(type, core_data) 930ac3b4328SSong Liu size += mk->mod->mem[type].size; 931ac3b4328SSong Liu } 932ac3b4328SSong Liu return sprintf(buffer, "%u\n", size); 933cfc1d277SAaron Tomlin } 934cfc1d277SAaron Tomlin 935cfc1d277SAaron Tomlin static struct module_attribute modinfo_coresize = 936cfc1d277SAaron Tomlin __ATTR(coresize, 0444, show_coresize, NULL); 937cfc1d277SAaron Tomlin 93801dc0386SChristophe Leroy #ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC 93901dc0386SChristophe Leroy static ssize_t show_datasize(struct module_attribute *mattr, 94001dc0386SChristophe Leroy struct module_kobject *mk, char *buffer) 94101dc0386SChristophe Leroy { 942ac3b4328SSong Liu unsigned int size = 0; 943ac3b4328SSong Liu 944ac3b4328SSong Liu for_class_mod_mem_type(type, core_data) 945ac3b4328SSong Liu size += mk->mod->mem[type].size; 946ac3b4328SSong Liu return sprintf(buffer, "%u\n", size); 94701dc0386SChristophe Leroy } 94801dc0386SChristophe Leroy 94901dc0386SChristophe Leroy static struct module_attribute modinfo_datasize = 95001dc0386SChristophe Leroy __ATTR(datasize, 0444, show_datasize, NULL); 95101dc0386SChristophe Leroy #endif 95201dc0386SChristophe Leroy 953cfc1d277SAaron Tomlin static ssize_t show_initsize(struct module_attribute *mattr, 954cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) 955cfc1d277SAaron Tomlin { 956ac3b4328SSong Liu unsigned int size = 0; 957ac3b4328SSong Liu 958ac3b4328SSong Liu for_class_mod_mem_type(type, init) 959ac3b4328SSong Liu size += mk->mod->mem[type].size; 960ac3b4328SSong Liu return sprintf(buffer, "%u\n", size); 961cfc1d277SAaron Tomlin } 962cfc1d277SAaron Tomlin 963cfc1d277SAaron Tomlin static struct module_attribute modinfo_initsize = 964cfc1d277SAaron Tomlin __ATTR(initsize, 0444, show_initsize, NULL); 965cfc1d277SAaron Tomlin 966cfc1d277SAaron Tomlin static ssize_t show_taint(struct module_attribute *mattr, 967cfc1d277SAaron Tomlin struct module_kobject *mk, char *buffer) 968cfc1d277SAaron Tomlin { 969cfc1d277SAaron Tomlin size_t l; 970cfc1d277SAaron Tomlin 971c14e522bSAaron Tomlin l = module_flags_taint(mk->mod->taints, buffer); 972cfc1d277SAaron Tomlin buffer[l++] = '\n'; 973cfc1d277SAaron Tomlin return l; 974cfc1d277SAaron Tomlin } 975cfc1d277SAaron Tomlin 976cfc1d277SAaron Tomlin static struct module_attribute modinfo_taint = 977cfc1d277SAaron Tomlin __ATTR(taint, 0444, show_taint, NULL); 978cfc1d277SAaron Tomlin 97944c09535SAaron Tomlin struct module_attribute *modinfo_attrs[] = { 980cfc1d277SAaron Tomlin &module_uevent, 981cfc1d277SAaron Tomlin &modinfo_version, 982cfc1d277SAaron Tomlin &modinfo_srcversion, 983cfc1d277SAaron Tomlin &modinfo_initstate, 984cfc1d277SAaron Tomlin &modinfo_coresize, 98501dc0386SChristophe Leroy #ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC 98601dc0386SChristophe Leroy &modinfo_datasize, 98701dc0386SChristophe Leroy #endif 988cfc1d277SAaron Tomlin &modinfo_initsize, 989cfc1d277SAaron Tomlin &modinfo_taint, 990cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_UNLOAD 991cfc1d277SAaron Tomlin &modinfo_refcnt, 992cfc1d277SAaron Tomlin #endif 993cfc1d277SAaron Tomlin NULL, 994cfc1d277SAaron Tomlin }; 995cfc1d277SAaron Tomlin 99644c09535SAaron Tomlin size_t modinfo_attrs_count = ARRAY_SIZE(modinfo_attrs); 99744c09535SAaron Tomlin 998cfc1d277SAaron Tomlin static const char vermagic[] = VERMAGIC_STRING; 999cfc1d277SAaron Tomlin 100047889798SAaron Tomlin int try_to_force_load(struct module *mod, const char *reason) 1001cfc1d277SAaron Tomlin { 1002cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_FORCE_LOAD 1003cfc1d277SAaron Tomlin if (!test_taint(TAINT_FORCED_MODULE)) 1004cfc1d277SAaron Tomlin pr_warn("%s: %s: kernel tainted.\n", mod->name, reason); 1005cfc1d277SAaron Tomlin add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE); 1006cfc1d277SAaron Tomlin return 0; 1007cfc1d277SAaron Tomlin #else 1008cfc1d277SAaron Tomlin return -ENOEXEC; 1009cfc1d277SAaron Tomlin #endif 1010cfc1d277SAaron Tomlin } 1011cfc1d277SAaron Tomlin 1012b66973b8SLuis Chamberlain /* Parse tag=value strings from .modinfo section */ 1013feb5b784SLuis Chamberlain char *module_next_tag_pair(char *string, unsigned long *secsize) 1014b66973b8SLuis Chamberlain { 1015b66973b8SLuis Chamberlain /* Skip non-zero chars */ 1016b66973b8SLuis Chamberlain while (string[0]) { 1017b66973b8SLuis Chamberlain string++; 1018b66973b8SLuis Chamberlain if ((*secsize)-- <= 1) 1019b66973b8SLuis Chamberlain return NULL; 1020b66973b8SLuis Chamberlain } 1021b66973b8SLuis Chamberlain 1022b66973b8SLuis Chamberlain /* Skip any zero padding. */ 1023b66973b8SLuis Chamberlain while (!string[0]) { 1024b66973b8SLuis Chamberlain string++; 1025b66973b8SLuis Chamberlain if ((*secsize)-- <= 1) 1026b66973b8SLuis Chamberlain return NULL; 1027b66973b8SLuis Chamberlain } 1028b66973b8SLuis Chamberlain return string; 1029b66973b8SLuis Chamberlain } 1030b66973b8SLuis Chamberlain 1031cfc1d277SAaron Tomlin static char *get_next_modinfo(const struct load_info *info, const char *tag, 1032b66973b8SLuis Chamberlain char *prev) 1033b66973b8SLuis Chamberlain { 1034b66973b8SLuis Chamberlain char *p; 1035b66973b8SLuis Chamberlain unsigned int taglen = strlen(tag); 1036b66973b8SLuis Chamberlain Elf_Shdr *infosec = &info->sechdrs[info->index.info]; 1037b66973b8SLuis Chamberlain unsigned long size = infosec->sh_size; 1038b66973b8SLuis Chamberlain 1039b66973b8SLuis Chamberlain /* 1040b66973b8SLuis Chamberlain * get_modinfo() calls made before rewrite_section_headers() 1041b66973b8SLuis Chamberlain * must use sh_offset, as sh_addr isn't set! 1042b66973b8SLuis Chamberlain */ 1043b66973b8SLuis Chamberlain char *modinfo = (char *)info->hdr + infosec->sh_offset; 1044b66973b8SLuis Chamberlain 1045b66973b8SLuis Chamberlain if (prev) { 1046b66973b8SLuis Chamberlain size -= prev - modinfo; 1047feb5b784SLuis Chamberlain modinfo = module_next_tag_pair(prev, &size); 1048b66973b8SLuis Chamberlain } 1049b66973b8SLuis Chamberlain 1050feb5b784SLuis Chamberlain for (p = modinfo; p; p = module_next_tag_pair(p, &size)) { 1051b66973b8SLuis Chamberlain if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') 1052b66973b8SLuis Chamberlain return p + taglen + 1; 1053b66973b8SLuis Chamberlain } 1054b66973b8SLuis Chamberlain return NULL; 1055b66973b8SLuis Chamberlain } 1056b66973b8SLuis Chamberlain 1057b66973b8SLuis Chamberlain static char *get_modinfo(const struct load_info *info, const char *tag) 1058b66973b8SLuis Chamberlain { 1059b66973b8SLuis Chamberlain return get_next_modinfo(info, tag, NULL); 1060b66973b8SLuis Chamberlain } 1061cfc1d277SAaron Tomlin 1062cfc1d277SAaron Tomlin static int verify_namespace_is_imported(const struct load_info *info, 1063cfc1d277SAaron Tomlin const struct kernel_symbol *sym, 1064cfc1d277SAaron Tomlin struct module *mod) 1065cfc1d277SAaron Tomlin { 1066cfc1d277SAaron Tomlin const char *namespace; 1067cfc1d277SAaron Tomlin char *imported_namespace; 1068cfc1d277SAaron Tomlin 1069cfc1d277SAaron Tomlin namespace = kernel_symbol_namespace(sym); 1070cfc1d277SAaron Tomlin if (namespace && namespace[0]) { 10711e684172SLuis Chamberlain for_each_modinfo_entry(imported_namespace, info, "import_ns") { 1072cfc1d277SAaron Tomlin if (strcmp(namespace, imported_namespace) == 0) 1073cfc1d277SAaron Tomlin return 0; 1074cfc1d277SAaron Tomlin } 1075cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS 1076cfc1d277SAaron Tomlin pr_warn( 1077cfc1d277SAaron Tomlin #else 1078cfc1d277SAaron Tomlin pr_err( 1079cfc1d277SAaron Tomlin #endif 1080cfc1d277SAaron Tomlin "%s: module uses symbol (%s) from namespace %s, but does not import it.\n", 1081cfc1d277SAaron Tomlin mod->name, kernel_symbol_name(sym), namespace); 1082cfc1d277SAaron Tomlin #ifndef CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS 1083cfc1d277SAaron Tomlin return -EINVAL; 1084cfc1d277SAaron Tomlin #endif 1085cfc1d277SAaron Tomlin } 1086cfc1d277SAaron Tomlin return 0; 1087cfc1d277SAaron Tomlin } 1088cfc1d277SAaron Tomlin 10898eac910aSLecopzer Chen static bool inherit_taint(struct module *mod, struct module *owner, const char *name) 1090cfc1d277SAaron Tomlin { 1091cfc1d277SAaron Tomlin if (!owner || !test_bit(TAINT_PROPRIETARY_MODULE, &owner->taints)) 1092cfc1d277SAaron Tomlin return true; 1093cfc1d277SAaron Tomlin 1094cfc1d277SAaron Tomlin if (mod->using_gplonly_symbols) { 10958eac910aSLecopzer Chen pr_err("%s: module using GPL-only symbols uses symbols %s from proprietary module %s.\n", 10968eac910aSLecopzer Chen mod->name, name, owner->name); 1097cfc1d277SAaron Tomlin return false; 1098cfc1d277SAaron Tomlin } 1099cfc1d277SAaron Tomlin 1100cfc1d277SAaron Tomlin if (!test_bit(TAINT_PROPRIETARY_MODULE, &mod->taints)) { 11018eac910aSLecopzer Chen pr_warn("%s: module uses symbols %s from proprietary module %s, inheriting taint.\n", 11028eac910aSLecopzer Chen mod->name, name, owner->name); 1103cfc1d277SAaron Tomlin set_bit(TAINT_PROPRIETARY_MODULE, &mod->taints); 1104cfc1d277SAaron Tomlin } 1105cfc1d277SAaron Tomlin return true; 1106cfc1d277SAaron Tomlin } 1107cfc1d277SAaron Tomlin 1108cfc1d277SAaron Tomlin /* Resolve a symbol for this module. I.e. if we find one, record usage. */ 1109cfc1d277SAaron Tomlin static const struct kernel_symbol *resolve_symbol(struct module *mod, 1110cfc1d277SAaron Tomlin const struct load_info *info, 1111cfc1d277SAaron Tomlin const char *name, 1112cfc1d277SAaron Tomlin char ownername[]) 1113cfc1d277SAaron Tomlin { 1114cfc1d277SAaron Tomlin struct find_symbol_arg fsa = { 1115cfc1d277SAaron Tomlin .name = name, 1116cfc1d277SAaron Tomlin .gplok = !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), 1117cfc1d277SAaron Tomlin .warn = true, 1118cfc1d277SAaron Tomlin }; 1119cfc1d277SAaron Tomlin int err; 1120cfc1d277SAaron Tomlin 1121cfc1d277SAaron Tomlin /* 1122cfc1d277SAaron Tomlin * The module_mutex should not be a heavily contended lock; 1123cfc1d277SAaron Tomlin * if we get the occasional sleep here, we'll go an extra iteration 1124cfc1d277SAaron Tomlin * in the wait_event_interruptible(), which is harmless. 1125cfc1d277SAaron Tomlin */ 1126cfc1d277SAaron Tomlin sched_annotate_sleep(); 1127cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 1128cfc1d277SAaron Tomlin if (!find_symbol(&fsa)) 1129cfc1d277SAaron Tomlin goto unlock; 1130cfc1d277SAaron Tomlin 1131cfc1d277SAaron Tomlin if (fsa.license == GPL_ONLY) 1132cfc1d277SAaron Tomlin mod->using_gplonly_symbols = true; 1133cfc1d277SAaron Tomlin 11348eac910aSLecopzer Chen if (!inherit_taint(mod, fsa.owner, name)) { 1135cfc1d277SAaron Tomlin fsa.sym = NULL; 1136cfc1d277SAaron Tomlin goto getname; 1137cfc1d277SAaron Tomlin } 1138cfc1d277SAaron Tomlin 1139cfc1d277SAaron Tomlin if (!check_version(info, name, mod, fsa.crc)) { 1140cfc1d277SAaron Tomlin fsa.sym = ERR_PTR(-EINVAL); 1141cfc1d277SAaron Tomlin goto getname; 1142cfc1d277SAaron Tomlin } 1143cfc1d277SAaron Tomlin 1144cfc1d277SAaron Tomlin err = verify_namespace_is_imported(info, fsa.sym, mod); 1145cfc1d277SAaron Tomlin if (err) { 1146cfc1d277SAaron Tomlin fsa.sym = ERR_PTR(err); 1147cfc1d277SAaron Tomlin goto getname; 1148cfc1d277SAaron Tomlin } 1149cfc1d277SAaron Tomlin 1150cfc1d277SAaron Tomlin err = ref_module(mod, fsa.owner); 1151cfc1d277SAaron Tomlin if (err) { 1152cfc1d277SAaron Tomlin fsa.sym = ERR_PTR(err); 1153cfc1d277SAaron Tomlin goto getname; 1154cfc1d277SAaron Tomlin } 1155cfc1d277SAaron Tomlin 1156cfc1d277SAaron Tomlin getname: 1157cfc1d277SAaron Tomlin /* We must make copy under the lock if we failed to get ref. */ 1158cfc1d277SAaron Tomlin strncpy(ownername, module_name(fsa.owner), MODULE_NAME_LEN); 1159cfc1d277SAaron Tomlin unlock: 1160cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 1161cfc1d277SAaron Tomlin return fsa.sym; 1162cfc1d277SAaron Tomlin } 1163cfc1d277SAaron Tomlin 1164cfc1d277SAaron Tomlin static const struct kernel_symbol * 1165cfc1d277SAaron Tomlin resolve_symbol_wait(struct module *mod, 1166cfc1d277SAaron Tomlin const struct load_info *info, 1167cfc1d277SAaron Tomlin const char *name) 1168cfc1d277SAaron Tomlin { 1169cfc1d277SAaron Tomlin const struct kernel_symbol *ksym; 1170cfc1d277SAaron Tomlin char owner[MODULE_NAME_LEN]; 1171cfc1d277SAaron Tomlin 1172cfc1d277SAaron Tomlin if (wait_event_interruptible_timeout(module_wq, 1173cfc1d277SAaron Tomlin !IS_ERR(ksym = resolve_symbol(mod, info, name, owner)) 1174cfc1d277SAaron Tomlin || PTR_ERR(ksym) != -EBUSY, 1175cfc1d277SAaron Tomlin 30 * HZ) <= 0) { 1176cfc1d277SAaron Tomlin pr_warn("%s: gave up waiting for init of module %s.\n", 1177cfc1d277SAaron Tomlin mod->name, owner); 1178cfc1d277SAaron Tomlin } 1179cfc1d277SAaron Tomlin return ksym; 1180cfc1d277SAaron Tomlin } 1181cfc1d277SAaron Tomlin 1182cfc1d277SAaron Tomlin void __weak module_memfree(void *module_region) 1183cfc1d277SAaron Tomlin { 1184cfc1d277SAaron Tomlin /* 1185cfc1d277SAaron Tomlin * This memory may be RO, and freeing RO memory in an interrupt is not 1186cfc1d277SAaron Tomlin * supported by vmalloc. 1187cfc1d277SAaron Tomlin */ 1188cfc1d277SAaron Tomlin WARN_ON(in_interrupt()); 1189cfc1d277SAaron Tomlin vfree(module_region); 1190cfc1d277SAaron Tomlin } 1191cfc1d277SAaron Tomlin 1192cfc1d277SAaron Tomlin void __weak module_arch_cleanup(struct module *mod) 1193cfc1d277SAaron Tomlin { 1194cfc1d277SAaron Tomlin } 1195cfc1d277SAaron Tomlin 1196cfc1d277SAaron Tomlin void __weak module_arch_freeing_init(struct module *mod) 1197cfc1d277SAaron Tomlin { 1198cfc1d277SAaron Tomlin } 1199cfc1d277SAaron Tomlin 1200ac3b4328SSong Liu static bool mod_mem_use_vmalloc(enum mod_mem_type type) 1201ac3b4328SSong Liu { 1202ac3b4328SSong Liu return IS_ENABLED(CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC) && 1203ac3b4328SSong Liu mod_mem_type_is_core_data(type); 1204ac3b4328SSong Liu } 1205ac3b4328SSong Liu 1206ac3b4328SSong Liu static void *module_memory_alloc(unsigned int size, enum mod_mem_type type) 1207ac3b4328SSong Liu { 1208ac3b4328SSong Liu if (mod_mem_use_vmalloc(type)) 1209ac3b4328SSong Liu return vzalloc(size); 1210ac3b4328SSong Liu return module_alloc(size); 1211ac3b4328SSong Liu } 1212ac3b4328SSong Liu 1213ac3b4328SSong Liu static void module_memory_free(void *ptr, enum mod_mem_type type) 1214ac3b4328SSong Liu { 1215ac3b4328SSong Liu if (mod_mem_use_vmalloc(type)) 1216ac3b4328SSong Liu vfree(ptr); 1217ac3b4328SSong Liu else 1218ac3b4328SSong Liu module_memfree(ptr); 1219ac3b4328SSong Liu } 1220ac3b4328SSong Liu 1221ac3b4328SSong Liu static void free_mod_mem(struct module *mod) 1222ac3b4328SSong Liu { 1223ac3b4328SSong Liu for_each_mod_mem_type(type) { 1224ac3b4328SSong Liu struct module_memory *mod_mem = &mod->mem[type]; 1225ac3b4328SSong Liu 1226ac3b4328SSong Liu if (type == MOD_DATA) 1227ac3b4328SSong Liu continue; 1228ac3b4328SSong Liu 1229ac3b4328SSong Liu /* Free lock-classes; relies on the preceding sync_rcu(). */ 1230ac3b4328SSong Liu lockdep_free_key_range(mod_mem->base, mod_mem->size); 1231ac3b4328SSong Liu if (mod_mem->size) 1232ac3b4328SSong Liu module_memory_free(mod_mem->base, type); 1233ac3b4328SSong Liu } 1234ac3b4328SSong Liu 1235ac3b4328SSong Liu /* MOD_DATA hosts mod, so free it at last */ 1236ac3b4328SSong Liu lockdep_free_key_range(mod->mem[MOD_DATA].base, mod->mem[MOD_DATA].size); 1237ac3b4328SSong Liu module_memory_free(mod->mem[MOD_DATA].base, MOD_DATA); 1238ac3b4328SSong Liu } 1239ac3b4328SSong Liu 1240cfc1d277SAaron Tomlin /* Free a module, remove from lists, etc. */ 1241cfc1d277SAaron Tomlin static void free_module(struct module *mod) 1242cfc1d277SAaron Tomlin { 1243cfc1d277SAaron Tomlin trace_module_free(mod); 1244cfc1d277SAaron Tomlin 1245cfc1d277SAaron Tomlin mod_sysfs_teardown(mod); 1246cfc1d277SAaron Tomlin 1247cfc1d277SAaron Tomlin /* 1248cfc1d277SAaron Tomlin * We leave it in list to prevent duplicate loads, but make sure 1249cfc1d277SAaron Tomlin * that noone uses it while it's being deconstructed. 1250cfc1d277SAaron Tomlin */ 1251cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 1252cfc1d277SAaron Tomlin mod->state = MODULE_STATE_UNFORMED; 1253cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 1254cfc1d277SAaron Tomlin 1255cfc1d277SAaron Tomlin /* Arch-specific cleanup. */ 1256cfc1d277SAaron Tomlin module_arch_cleanup(mod); 1257cfc1d277SAaron Tomlin 1258cfc1d277SAaron Tomlin /* Module unload stuff */ 1259cfc1d277SAaron Tomlin module_unload_free(mod); 1260cfc1d277SAaron Tomlin 1261cfc1d277SAaron Tomlin /* Free any allocated parameters. */ 1262cfc1d277SAaron Tomlin destroy_params(mod->kp, mod->num_kp); 1263cfc1d277SAaron Tomlin 1264cfc1d277SAaron Tomlin if (is_livepatch_module(mod)) 1265cfc1d277SAaron Tomlin free_module_elf(mod); 1266cfc1d277SAaron Tomlin 1267cfc1d277SAaron Tomlin /* Now we can delete it from the lists */ 1268cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 1269cfc1d277SAaron Tomlin /* Unlink carefully: kallsyms could be walking list. */ 1270cfc1d277SAaron Tomlin list_del_rcu(&mod->list); 1271cfc1d277SAaron Tomlin mod_tree_remove(mod); 1272cfc1d277SAaron Tomlin /* Remove this module from bug list, this uses list_del_rcu */ 1273cfc1d277SAaron Tomlin module_bug_cleanup(mod); 1274cfc1d277SAaron Tomlin /* Wait for RCU-sched synchronizing before releasing mod->list and buglist. */ 1275cfc1d277SAaron Tomlin synchronize_rcu(); 127699bd9956SAaron Tomlin if (try_add_tainted_module(mod)) 127799bd9956SAaron Tomlin pr_err("%s: adding tainted module to the unloaded tainted modules list failed.\n", 127899bd9956SAaron Tomlin mod->name); 1279cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 1280cfc1d277SAaron Tomlin 1281cfc1d277SAaron Tomlin /* This may be empty, but that's OK */ 1282cfc1d277SAaron Tomlin module_arch_freeing_init(mod); 1283cfc1d277SAaron Tomlin kfree(mod->args); 1284cfc1d277SAaron Tomlin percpu_modfree(mod); 1285cfc1d277SAaron Tomlin 1286ac3b4328SSong Liu free_mod_mem(mod); 1287cfc1d277SAaron Tomlin } 1288cfc1d277SAaron Tomlin 1289cfc1d277SAaron Tomlin void *__symbol_get(const char *symbol) 1290cfc1d277SAaron Tomlin { 1291cfc1d277SAaron Tomlin struct find_symbol_arg fsa = { 1292cfc1d277SAaron Tomlin .name = symbol, 1293cfc1d277SAaron Tomlin .gplok = true, 1294cfc1d277SAaron Tomlin .warn = true, 1295cfc1d277SAaron Tomlin }; 1296cfc1d277SAaron Tomlin 1297cfc1d277SAaron Tomlin preempt_disable(); 12989011e49dSChristoph Hellwig if (!find_symbol(&fsa)) 12999011e49dSChristoph Hellwig goto fail; 13009011e49dSChristoph Hellwig if (fsa.license != GPL_ONLY) { 13019011e49dSChristoph Hellwig pr_warn("failing symbol_get of non-GPLONLY symbol %s.\n", 13029011e49dSChristoph Hellwig symbol); 13039011e49dSChristoph Hellwig goto fail; 1304cfc1d277SAaron Tomlin } 13059011e49dSChristoph Hellwig if (strong_try_module_get(fsa.owner)) 13069011e49dSChristoph Hellwig goto fail; 1307cfc1d277SAaron Tomlin preempt_enable(); 1308cfc1d277SAaron Tomlin return (void *)kernel_symbol_value(fsa.sym); 13099011e49dSChristoph Hellwig fail: 13109011e49dSChristoph Hellwig preempt_enable(); 13119011e49dSChristoph Hellwig return NULL; 1312cfc1d277SAaron Tomlin } 1313cfc1d277SAaron Tomlin EXPORT_SYMBOL_GPL(__symbol_get); 1314cfc1d277SAaron Tomlin 1315cfc1d277SAaron Tomlin /* 1316cfc1d277SAaron Tomlin * Ensure that an exported symbol [global namespace] does not already exist 1317cfc1d277SAaron Tomlin * in the kernel or in some other module's exported symbol table. 1318cfc1d277SAaron Tomlin * 1319cfc1d277SAaron Tomlin * You must hold the module_mutex. 1320cfc1d277SAaron Tomlin */ 1321cfc1d277SAaron Tomlin static int verify_exported_symbols(struct module *mod) 1322cfc1d277SAaron Tomlin { 1323cfc1d277SAaron Tomlin unsigned int i; 1324cfc1d277SAaron Tomlin const struct kernel_symbol *s; 1325cfc1d277SAaron Tomlin struct { 1326cfc1d277SAaron Tomlin const struct kernel_symbol *sym; 1327cfc1d277SAaron Tomlin unsigned int num; 1328cfc1d277SAaron Tomlin } arr[] = { 1329cfc1d277SAaron Tomlin { mod->syms, mod->num_syms }, 1330cfc1d277SAaron Tomlin { mod->gpl_syms, mod->num_gpl_syms }, 1331cfc1d277SAaron Tomlin }; 1332cfc1d277SAaron Tomlin 1333cfc1d277SAaron Tomlin for (i = 0; i < ARRAY_SIZE(arr); i++) { 1334cfc1d277SAaron Tomlin for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) { 1335cfc1d277SAaron Tomlin struct find_symbol_arg fsa = { 1336cfc1d277SAaron Tomlin .name = kernel_symbol_name(s), 1337cfc1d277SAaron Tomlin .gplok = true, 1338cfc1d277SAaron Tomlin }; 1339cfc1d277SAaron Tomlin if (find_symbol(&fsa)) { 1340cfc1d277SAaron Tomlin pr_err("%s: exports duplicate symbol %s" 1341cfc1d277SAaron Tomlin " (owned by %s)\n", 1342cfc1d277SAaron Tomlin mod->name, kernel_symbol_name(s), 1343cfc1d277SAaron Tomlin module_name(fsa.owner)); 1344cfc1d277SAaron Tomlin return -ENOEXEC; 1345cfc1d277SAaron Tomlin } 1346cfc1d277SAaron Tomlin } 1347cfc1d277SAaron Tomlin } 1348cfc1d277SAaron Tomlin return 0; 1349cfc1d277SAaron Tomlin } 1350cfc1d277SAaron Tomlin 1351cfc1d277SAaron Tomlin static bool ignore_undef_symbol(Elf_Half emachine, const char *name) 1352cfc1d277SAaron Tomlin { 1353cfc1d277SAaron Tomlin /* 1354cfc1d277SAaron Tomlin * On x86, PIC code and Clang non-PIC code may have call foo@PLT. GNU as 1355cfc1d277SAaron Tomlin * before 2.37 produces an unreferenced _GLOBAL_OFFSET_TABLE_ on x86-64. 1356cfc1d277SAaron Tomlin * i386 has a similar problem but may not deserve a fix. 1357cfc1d277SAaron Tomlin * 1358cfc1d277SAaron Tomlin * If we ever have to ignore many symbols, consider refactoring the code to 1359cfc1d277SAaron Tomlin * only warn if referenced by a relocation. 1360cfc1d277SAaron Tomlin */ 1361cfc1d277SAaron Tomlin if (emachine == EM_386 || emachine == EM_X86_64) 1362cfc1d277SAaron Tomlin return !strcmp(name, "_GLOBAL_OFFSET_TABLE_"); 1363cfc1d277SAaron Tomlin return false; 1364cfc1d277SAaron Tomlin } 1365cfc1d277SAaron Tomlin 1366cfc1d277SAaron Tomlin /* Change all symbols so that st_value encodes the pointer directly. */ 1367cfc1d277SAaron Tomlin static int simplify_symbols(struct module *mod, const struct load_info *info) 1368cfc1d277SAaron Tomlin { 1369cfc1d277SAaron Tomlin Elf_Shdr *symsec = &info->sechdrs[info->index.sym]; 1370cfc1d277SAaron Tomlin Elf_Sym *sym = (void *)symsec->sh_addr; 1371cfc1d277SAaron Tomlin unsigned long secbase; 1372cfc1d277SAaron Tomlin unsigned int i; 1373cfc1d277SAaron Tomlin int ret = 0; 1374cfc1d277SAaron Tomlin const struct kernel_symbol *ksym; 1375cfc1d277SAaron Tomlin 1376cfc1d277SAaron Tomlin for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) { 1377cfc1d277SAaron Tomlin const char *name = info->strtab + sym[i].st_name; 1378cfc1d277SAaron Tomlin 1379cfc1d277SAaron Tomlin switch (sym[i].st_shndx) { 1380cfc1d277SAaron Tomlin case SHN_COMMON: 1381cfc1d277SAaron Tomlin /* Ignore common symbols */ 1382cfc1d277SAaron Tomlin if (!strncmp(name, "__gnu_lto", 9)) 1383cfc1d277SAaron Tomlin break; 1384cfc1d277SAaron Tomlin 1385cfc1d277SAaron Tomlin /* 1386cfc1d277SAaron Tomlin * We compiled with -fno-common. These are not 1387cfc1d277SAaron Tomlin * supposed to happen. 1388cfc1d277SAaron Tomlin */ 1389cfc1d277SAaron Tomlin pr_debug("Common symbol: %s\n", name); 1390cfc1d277SAaron Tomlin pr_warn("%s: please compile with -fno-common\n", 1391cfc1d277SAaron Tomlin mod->name); 1392cfc1d277SAaron Tomlin ret = -ENOEXEC; 1393cfc1d277SAaron Tomlin break; 1394cfc1d277SAaron Tomlin 1395cfc1d277SAaron Tomlin case SHN_ABS: 1396cfc1d277SAaron Tomlin /* Don't need to do anything */ 1397b10addf3SJim Cromie pr_debug("Absolute symbol: 0x%08lx %s\n", 1398b10addf3SJim Cromie (long)sym[i].st_value, name); 1399cfc1d277SAaron Tomlin break; 1400cfc1d277SAaron Tomlin 1401cfc1d277SAaron Tomlin case SHN_LIVEPATCH: 1402cfc1d277SAaron Tomlin /* Livepatch symbols are resolved by livepatch */ 1403cfc1d277SAaron Tomlin break; 1404cfc1d277SAaron Tomlin 1405cfc1d277SAaron Tomlin case SHN_UNDEF: 1406cfc1d277SAaron Tomlin ksym = resolve_symbol_wait(mod, info, name); 1407cfc1d277SAaron Tomlin /* Ok if resolved. */ 1408cfc1d277SAaron Tomlin if (ksym && !IS_ERR(ksym)) { 1409cfc1d277SAaron Tomlin sym[i].st_value = kernel_symbol_value(ksym); 1410cfc1d277SAaron Tomlin break; 1411cfc1d277SAaron Tomlin } 1412cfc1d277SAaron Tomlin 1413cfc1d277SAaron Tomlin /* Ok if weak or ignored. */ 1414cfc1d277SAaron Tomlin if (!ksym && 1415cfc1d277SAaron Tomlin (ELF_ST_BIND(sym[i].st_info) == STB_WEAK || 1416cfc1d277SAaron Tomlin ignore_undef_symbol(info->hdr->e_machine, name))) 1417cfc1d277SAaron Tomlin break; 1418cfc1d277SAaron Tomlin 1419cfc1d277SAaron Tomlin ret = PTR_ERR(ksym) ?: -ENOENT; 1420cfc1d277SAaron Tomlin pr_warn("%s: Unknown symbol %s (err %d)\n", 1421cfc1d277SAaron Tomlin mod->name, name, ret); 1422cfc1d277SAaron Tomlin break; 1423cfc1d277SAaron Tomlin 1424cfc1d277SAaron Tomlin default: 1425cfc1d277SAaron Tomlin /* Divert to percpu allocation if a percpu var. */ 1426cfc1d277SAaron Tomlin if (sym[i].st_shndx == info->index.pcpu) 1427cfc1d277SAaron Tomlin secbase = (unsigned long)mod_percpu(mod); 1428cfc1d277SAaron Tomlin else 1429cfc1d277SAaron Tomlin secbase = info->sechdrs[sym[i].st_shndx].sh_addr; 1430cfc1d277SAaron Tomlin sym[i].st_value += secbase; 1431cfc1d277SAaron Tomlin break; 1432cfc1d277SAaron Tomlin } 1433cfc1d277SAaron Tomlin } 1434cfc1d277SAaron Tomlin 1435cfc1d277SAaron Tomlin return ret; 1436cfc1d277SAaron Tomlin } 1437cfc1d277SAaron Tomlin 1438cfc1d277SAaron Tomlin static int apply_relocations(struct module *mod, const struct load_info *info) 1439cfc1d277SAaron Tomlin { 1440cfc1d277SAaron Tomlin unsigned int i; 1441cfc1d277SAaron Tomlin int err = 0; 1442cfc1d277SAaron Tomlin 1443cfc1d277SAaron Tomlin /* Now do relocations. */ 1444cfc1d277SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 1445cfc1d277SAaron Tomlin unsigned int infosec = info->sechdrs[i].sh_info; 1446cfc1d277SAaron Tomlin 1447cfc1d277SAaron Tomlin /* Not a valid relocation section? */ 1448cfc1d277SAaron Tomlin if (infosec >= info->hdr->e_shnum) 1449cfc1d277SAaron Tomlin continue; 1450cfc1d277SAaron Tomlin 1451cfc1d277SAaron Tomlin /* Don't bother with non-allocated sections */ 1452cfc1d277SAaron Tomlin if (!(info->sechdrs[infosec].sh_flags & SHF_ALLOC)) 1453cfc1d277SAaron Tomlin continue; 1454cfc1d277SAaron Tomlin 1455cfc1d277SAaron Tomlin if (info->sechdrs[i].sh_flags & SHF_RELA_LIVEPATCH) 1456cfc1d277SAaron Tomlin err = klp_apply_section_relocs(mod, info->sechdrs, 1457cfc1d277SAaron Tomlin info->secstrings, 1458cfc1d277SAaron Tomlin info->strtab, 1459cfc1d277SAaron Tomlin info->index.sym, i, 1460cfc1d277SAaron Tomlin NULL); 1461cfc1d277SAaron Tomlin else if (info->sechdrs[i].sh_type == SHT_REL) 1462cfc1d277SAaron Tomlin err = apply_relocate(info->sechdrs, info->strtab, 1463cfc1d277SAaron Tomlin info->index.sym, i, mod); 1464cfc1d277SAaron Tomlin else if (info->sechdrs[i].sh_type == SHT_RELA) 1465cfc1d277SAaron Tomlin err = apply_relocate_add(info->sechdrs, info->strtab, 1466cfc1d277SAaron Tomlin info->index.sym, i, mod); 1467cfc1d277SAaron Tomlin if (err < 0) 1468cfc1d277SAaron Tomlin break; 1469cfc1d277SAaron Tomlin } 1470cfc1d277SAaron Tomlin return err; 1471cfc1d277SAaron Tomlin } 1472cfc1d277SAaron Tomlin 1473cfc1d277SAaron Tomlin /* Additional bytes needed by arch in front of individual sections */ 1474cfc1d277SAaron Tomlin unsigned int __weak arch_mod_section_prepend(struct module *mod, 1475cfc1d277SAaron Tomlin unsigned int section) 1476cfc1d277SAaron Tomlin { 1477cfc1d277SAaron Tomlin /* default implementation just returns zero */ 1478cfc1d277SAaron Tomlin return 0; 1479cfc1d277SAaron Tomlin } 1480cfc1d277SAaron Tomlin 1481ac3b4328SSong Liu long module_get_offset_and_type(struct module *mod, enum mod_mem_type type, 1482cfc1d277SAaron Tomlin Elf_Shdr *sechdr, unsigned int section) 1483cfc1d277SAaron Tomlin { 1484ac3b4328SSong Liu long offset; 1485ac3b4328SSong Liu long mask = ((unsigned long)(type) & SH_ENTSIZE_TYPE_MASK) << SH_ENTSIZE_TYPE_SHIFT; 1486cfc1d277SAaron Tomlin 1487ac3b4328SSong Liu mod->mem[type].size += arch_mod_section_prepend(mod, section); 1488ac3b4328SSong Liu offset = ALIGN(mod->mem[type].size, sechdr->sh_addralign ?: 1); 1489ac3b4328SSong Liu mod->mem[type].size = offset + sechdr->sh_size; 1490ac3b4328SSong Liu 1491ac3b4328SSong Liu WARN_ON_ONCE(offset & mask); 1492ac3b4328SSong Liu return offset | mask; 1493cfc1d277SAaron Tomlin } 1494cfc1d277SAaron Tomlin 14952abcc4b5SJames Morse bool module_init_layout_section(const char *sname) 1496cfc1d277SAaron Tomlin { 1497cfc1d277SAaron Tomlin #ifndef CONFIG_MODULE_UNLOAD 1498cfc1d277SAaron Tomlin if (module_exit_section(sname)) 1499cfc1d277SAaron Tomlin return true; 1500cfc1d277SAaron Tomlin #endif 1501cfc1d277SAaron Tomlin return module_init_section(sname); 1502cfc1d277SAaron Tomlin } 1503cfc1d277SAaron Tomlin 1504ac3b4328SSong Liu static void __layout_sections(struct module *mod, struct load_info *info, bool is_init) 1505cfc1d277SAaron Tomlin { 1506ac3b4328SSong Liu unsigned int m, i; 1507ac3b4328SSong Liu 1508ac3b4328SSong Liu static const unsigned long masks[][2] = { 1509cfc1d277SAaron Tomlin /* 1510cfc1d277SAaron Tomlin * NOTE: all executable code must be the first section 1511cfc1d277SAaron Tomlin * in this array; otherwise modify the text_size 1512cfc1d277SAaron Tomlin * finder in the two loops below 1513cfc1d277SAaron Tomlin */ 1514cfc1d277SAaron Tomlin { SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL }, 1515cfc1d277SAaron Tomlin { SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL }, 1516cfc1d277SAaron Tomlin { SHF_RO_AFTER_INIT | SHF_ALLOC, ARCH_SHF_SMALL }, 1517cfc1d277SAaron Tomlin { SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL }, 1518cfc1d277SAaron Tomlin { ARCH_SHF_SMALL | SHF_ALLOC, 0 } 1519cfc1d277SAaron Tomlin }; 1520ac3b4328SSong Liu static const int core_m_to_mem_type[] = { 1521ac3b4328SSong Liu MOD_TEXT, 1522ac3b4328SSong Liu MOD_RODATA, 1523ac3b4328SSong Liu MOD_RO_AFTER_INIT, 1524ac3b4328SSong Liu MOD_DATA, 1525db3e33ddSSong Liu MOD_DATA, 1526ac3b4328SSong Liu }; 1527ac3b4328SSong Liu static const int init_m_to_mem_type[] = { 1528ac3b4328SSong Liu MOD_INIT_TEXT, 1529ac3b4328SSong Liu MOD_INIT_RODATA, 1530ac3b4328SSong Liu MOD_INVALID, 1531ac3b4328SSong Liu MOD_INIT_DATA, 1532db3e33ddSSong Liu MOD_INIT_DATA, 1533ac3b4328SSong Liu }; 1534ac3b4328SSong Liu 1535ac3b4328SSong Liu for (m = 0; m < ARRAY_SIZE(masks); ++m) { 1536ac3b4328SSong Liu enum mod_mem_type type = is_init ? init_m_to_mem_type[m] : core_m_to_mem_type[m]; 1537ac3b4328SSong Liu 1538ac3b4328SSong Liu for (i = 0; i < info->hdr->e_shnum; ++i) { 1539ac3b4328SSong Liu Elf_Shdr *s = &info->sechdrs[i]; 1540ac3b4328SSong Liu const char *sname = info->secstrings + s->sh_name; 1541ac3b4328SSong Liu 1542ac3b4328SSong Liu if ((s->sh_flags & masks[m][0]) != masks[m][0] 1543ac3b4328SSong Liu || (s->sh_flags & masks[m][1]) 1544ac3b4328SSong Liu || s->sh_entsize != ~0UL 1545ac3b4328SSong Liu || is_init != module_init_layout_section(sname)) 1546ac3b4328SSong Liu continue; 1547ac3b4328SSong Liu 1548ac3b4328SSong Liu if (WARN_ON_ONCE(type == MOD_INVALID)) 1549ac3b4328SSong Liu continue; 1550ac3b4328SSong Liu 1551ac3b4328SSong Liu s->sh_entsize = module_get_offset_and_type(mod, type, s, i); 1552ac3b4328SSong Liu pr_debug("\t%s\n", sname); 1553ac3b4328SSong Liu } 1554ac3b4328SSong Liu } 1555ac3b4328SSong Liu } 1556ac3b4328SSong Liu 1557ac3b4328SSong Liu /* 1558ac3b4328SSong Liu * Lay out the SHF_ALLOC sections in a way not dissimilar to how ld 1559ac3b4328SSong Liu * might -- code, read-only data, read-write data, small data. Tally 1560ac3b4328SSong Liu * sizes, and place the offsets into sh_entsize fields: high bit means it 1561ac3b4328SSong Liu * belongs in init. 1562ac3b4328SSong Liu */ 1563ac3b4328SSong Liu static void layout_sections(struct module *mod, struct load_info *info) 1564ac3b4328SSong Liu { 1565ac3b4328SSong Liu unsigned int i; 1566cfc1d277SAaron Tomlin 1567cfc1d277SAaron Tomlin for (i = 0; i < info->hdr->e_shnum; i++) 1568cfc1d277SAaron Tomlin info->sechdrs[i].sh_entsize = ~0UL; 1569cfc1d277SAaron Tomlin 15706ed81802SJim Cromie pr_debug("Core section allocation order for %s:\n", mod->name); 1571ac3b4328SSong Liu __layout_sections(mod, info, false); 1572cfc1d277SAaron Tomlin 15736ed81802SJim Cromie pr_debug("Init section allocation order for %s:\n", mod->name); 1574ac3b4328SSong Liu __layout_sections(mod, info, true); 1575cfc1d277SAaron Tomlin } 1576cfc1d277SAaron Tomlin 1577ad8d3a36SLuis Chamberlain static void module_license_taint_check(struct module *mod, const char *license) 1578cfc1d277SAaron Tomlin { 1579cfc1d277SAaron Tomlin if (!license) 1580cfc1d277SAaron Tomlin license = "unspecified"; 1581cfc1d277SAaron Tomlin 1582cfc1d277SAaron Tomlin if (!license_is_gpl_compatible(license)) { 1583cfc1d277SAaron Tomlin if (!test_taint(TAINT_PROPRIETARY_MODULE)) 1584cfc1d277SAaron Tomlin pr_warn("%s: module license '%s' taints kernel.\n", 1585cfc1d277SAaron Tomlin mod->name, license); 1586cfc1d277SAaron Tomlin add_taint_module(mod, TAINT_PROPRIETARY_MODULE, 1587cfc1d277SAaron Tomlin LOCKDEP_NOW_UNRELIABLE); 1588cfc1d277SAaron Tomlin } 1589cfc1d277SAaron Tomlin } 1590cfc1d277SAaron Tomlin 1591cfc1d277SAaron Tomlin static void setup_modinfo(struct module *mod, struct load_info *info) 1592cfc1d277SAaron Tomlin { 1593cfc1d277SAaron Tomlin struct module_attribute *attr; 1594cfc1d277SAaron Tomlin int i; 1595cfc1d277SAaron Tomlin 1596cfc1d277SAaron Tomlin for (i = 0; (attr = modinfo_attrs[i]); i++) { 1597cfc1d277SAaron Tomlin if (attr->setup) 1598cfc1d277SAaron Tomlin attr->setup(mod, get_modinfo(info, attr->attr.name)); 1599cfc1d277SAaron Tomlin } 1600cfc1d277SAaron Tomlin } 1601cfc1d277SAaron Tomlin 1602cfc1d277SAaron Tomlin static void free_modinfo(struct module *mod) 1603cfc1d277SAaron Tomlin { 1604cfc1d277SAaron Tomlin struct module_attribute *attr; 1605cfc1d277SAaron Tomlin int i; 1606cfc1d277SAaron Tomlin 1607cfc1d277SAaron Tomlin for (i = 0; (attr = modinfo_attrs[i]); i++) { 1608cfc1d277SAaron Tomlin if (attr->free) 1609cfc1d277SAaron Tomlin attr->free(mod); 1610cfc1d277SAaron Tomlin } 1611cfc1d277SAaron Tomlin } 1612cfc1d277SAaron Tomlin 1613cfc1d277SAaron Tomlin void * __weak module_alloc(unsigned long size) 1614cfc1d277SAaron Tomlin { 1615cfc1d277SAaron Tomlin return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, 1616cfc1d277SAaron Tomlin GFP_KERNEL, PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, 1617cfc1d277SAaron Tomlin NUMA_NO_NODE, __builtin_return_address(0)); 1618cfc1d277SAaron Tomlin } 1619cfc1d277SAaron Tomlin 1620cfc1d277SAaron Tomlin bool __weak module_init_section(const char *name) 1621cfc1d277SAaron Tomlin { 1622cfc1d277SAaron Tomlin return strstarts(name, ".init"); 1623cfc1d277SAaron Tomlin } 1624cfc1d277SAaron Tomlin 1625cfc1d277SAaron Tomlin bool __weak module_exit_section(const char *name) 1626cfc1d277SAaron Tomlin { 1627cfc1d277SAaron Tomlin return strstarts(name, ".exit"); 1628cfc1d277SAaron Tomlin } 1629cfc1d277SAaron Tomlin 1630cfc1d277SAaron Tomlin static int validate_section_offset(struct load_info *info, Elf_Shdr *shdr) 1631cfc1d277SAaron Tomlin { 1632cfc1d277SAaron Tomlin #if defined(CONFIG_64BIT) 1633cfc1d277SAaron Tomlin unsigned long long secend; 1634cfc1d277SAaron Tomlin #else 1635cfc1d277SAaron Tomlin unsigned long secend; 1636cfc1d277SAaron Tomlin #endif 1637cfc1d277SAaron Tomlin 1638cfc1d277SAaron Tomlin /* 1639cfc1d277SAaron Tomlin * Check for both overflow and offset/size being 1640cfc1d277SAaron Tomlin * too large. 1641cfc1d277SAaron Tomlin */ 1642cfc1d277SAaron Tomlin secend = shdr->sh_offset + shdr->sh_size; 1643cfc1d277SAaron Tomlin if (secend < shdr->sh_offset || secend > info->len) 1644cfc1d277SAaron Tomlin return -ENOEXEC; 1645cfc1d277SAaron Tomlin 1646cfc1d277SAaron Tomlin return 0; 1647cfc1d277SAaron Tomlin } 1648cfc1d277SAaron Tomlin 1649cfc1d277SAaron Tomlin /* 16503d40bb90SLuis Chamberlain * Check userspace passed ELF module against our expectations, and cache 16513d40bb90SLuis Chamberlain * useful variables for further processing as we go. 1652cfc1d277SAaron Tomlin * 16533d40bb90SLuis Chamberlain * This does basic validity checks against section offsets and sizes, the 1654cfc1d277SAaron Tomlin * section name string table, and the indices used for it (sh_name). 16553d40bb90SLuis Chamberlain * 16563d40bb90SLuis Chamberlain * As a last step, since we're already checking the ELF sections we cache 16573d40bb90SLuis Chamberlain * useful variables which will be used later for our convenience: 16583d40bb90SLuis Chamberlain * 16593d40bb90SLuis Chamberlain * o pointers to section headers 16603d40bb90SLuis Chamberlain * o cache the modinfo symbol section 16613d40bb90SLuis Chamberlain * o cache the string symbol section 16623d40bb90SLuis Chamberlain * o cache the module section 16633d40bb90SLuis Chamberlain * 16643d40bb90SLuis Chamberlain * As a last step we set info->mod to the temporary copy of the module in 16653d40bb90SLuis Chamberlain * info->hdr. The final one will be allocated in move_module(). Any 16663d40bb90SLuis Chamberlain * modifications we make to our copy of the module will be carried over 16673d40bb90SLuis Chamberlain * to the final minted module. 1668cfc1d277SAaron Tomlin */ 16693d40bb90SLuis Chamberlain static int elf_validity_cache_copy(struct load_info *info, int flags) 1670cfc1d277SAaron Tomlin { 1671cfc1d277SAaron Tomlin unsigned int i; 1672cfc1d277SAaron Tomlin Elf_Shdr *shdr, *strhdr; 1673cfc1d277SAaron Tomlin int err; 167446752820SLuis Chamberlain unsigned int num_mod_secs = 0, mod_idx; 16751bb49db9SLuis Chamberlain unsigned int num_info_secs = 0, info_idx; 16761bb49db9SLuis Chamberlain unsigned int num_sym_secs = 0, sym_idx; 1677cfc1d277SAaron Tomlin 1678cfc1d277SAaron Tomlin if (info->len < sizeof(*(info->hdr))) { 1679cfc1d277SAaron Tomlin pr_err("Invalid ELF header len %lu\n", info->len); 1680cfc1d277SAaron Tomlin goto no_exec; 1681cfc1d277SAaron Tomlin } 1682cfc1d277SAaron Tomlin 1683cfc1d277SAaron Tomlin if (memcmp(info->hdr->e_ident, ELFMAG, SELFMAG) != 0) { 1684cfc1d277SAaron Tomlin pr_err("Invalid ELF header magic: != %s\n", ELFMAG); 1685cfc1d277SAaron Tomlin goto no_exec; 1686cfc1d277SAaron Tomlin } 1687cfc1d277SAaron Tomlin if (info->hdr->e_type != ET_REL) { 1688cfc1d277SAaron Tomlin pr_err("Invalid ELF header type: %u != %u\n", 1689cfc1d277SAaron Tomlin info->hdr->e_type, ET_REL); 1690cfc1d277SAaron Tomlin goto no_exec; 1691cfc1d277SAaron Tomlin } 1692cfc1d277SAaron Tomlin if (!elf_check_arch(info->hdr)) { 1693cfc1d277SAaron Tomlin pr_err("Invalid architecture in ELF header: %u\n", 1694cfc1d277SAaron Tomlin info->hdr->e_machine); 1695cfc1d277SAaron Tomlin goto no_exec; 1696cfc1d277SAaron Tomlin } 1697f9231a99SNicholas Piggin if (!module_elf_check_arch(info->hdr)) { 1698f9231a99SNicholas Piggin pr_err("Invalid module architecture in ELF header: %u\n", 1699f9231a99SNicholas Piggin info->hdr->e_machine); 1700f9231a99SNicholas Piggin goto no_exec; 1701f9231a99SNicholas Piggin } 1702cfc1d277SAaron Tomlin if (info->hdr->e_shentsize != sizeof(Elf_Shdr)) { 1703cfc1d277SAaron Tomlin pr_err("Invalid ELF section header size\n"); 1704cfc1d277SAaron Tomlin goto no_exec; 1705cfc1d277SAaron Tomlin } 1706cfc1d277SAaron Tomlin 1707cfc1d277SAaron Tomlin /* 1708cfc1d277SAaron Tomlin * e_shnum is 16 bits, and sizeof(Elf_Shdr) is 1709cfc1d277SAaron Tomlin * known and small. So e_shnum * sizeof(Elf_Shdr) 1710cfc1d277SAaron Tomlin * will not overflow unsigned long on any platform. 1711cfc1d277SAaron Tomlin */ 1712cfc1d277SAaron Tomlin if (info->hdr->e_shoff >= info->len 1713cfc1d277SAaron Tomlin || (info->hdr->e_shnum * sizeof(Elf_Shdr) > 1714cfc1d277SAaron Tomlin info->len - info->hdr->e_shoff)) { 1715cfc1d277SAaron Tomlin pr_err("Invalid ELF section header overflow\n"); 1716cfc1d277SAaron Tomlin goto no_exec; 1717cfc1d277SAaron Tomlin } 1718cfc1d277SAaron Tomlin 1719cfc1d277SAaron Tomlin info->sechdrs = (void *)info->hdr + info->hdr->e_shoff; 1720cfc1d277SAaron Tomlin 1721cfc1d277SAaron Tomlin /* 1722cfc1d277SAaron Tomlin * Verify if the section name table index is valid. 1723cfc1d277SAaron Tomlin */ 1724cfc1d277SAaron Tomlin if (info->hdr->e_shstrndx == SHN_UNDEF 1725cfc1d277SAaron Tomlin || info->hdr->e_shstrndx >= info->hdr->e_shnum) { 1726cfc1d277SAaron Tomlin pr_err("Invalid ELF section name index: %d || e_shstrndx (%d) >= e_shnum (%d)\n", 1727cfc1d277SAaron Tomlin info->hdr->e_shstrndx, info->hdr->e_shstrndx, 1728cfc1d277SAaron Tomlin info->hdr->e_shnum); 1729cfc1d277SAaron Tomlin goto no_exec; 1730cfc1d277SAaron Tomlin } 1731cfc1d277SAaron Tomlin 1732cfc1d277SAaron Tomlin strhdr = &info->sechdrs[info->hdr->e_shstrndx]; 1733cfc1d277SAaron Tomlin err = validate_section_offset(info, strhdr); 1734cfc1d277SAaron Tomlin if (err < 0) { 1735cfc1d277SAaron Tomlin pr_err("Invalid ELF section hdr(type %u)\n", strhdr->sh_type); 1736cfc1d277SAaron Tomlin return err; 1737cfc1d277SAaron Tomlin } 1738cfc1d277SAaron Tomlin 1739cfc1d277SAaron Tomlin /* 1740cfc1d277SAaron Tomlin * The section name table must be NUL-terminated, as required 1741cfc1d277SAaron Tomlin * by the spec. This makes strcmp and pr_* calls that access 1742cfc1d277SAaron Tomlin * strings in the section safe. 1743cfc1d277SAaron Tomlin */ 1744cfc1d277SAaron Tomlin info->secstrings = (void *)info->hdr + strhdr->sh_offset; 1745391e982bSAlexey Dobriyan if (strhdr->sh_size == 0) { 1746391e982bSAlexey Dobriyan pr_err("empty section name table\n"); 1747391e982bSAlexey Dobriyan goto no_exec; 1748391e982bSAlexey Dobriyan } 1749cfc1d277SAaron Tomlin if (info->secstrings[strhdr->sh_size - 1] != '\0') { 1750cfc1d277SAaron Tomlin pr_err("ELF Spec violation: section name table isn't null terminated\n"); 1751cfc1d277SAaron Tomlin goto no_exec; 1752cfc1d277SAaron Tomlin } 1753cfc1d277SAaron Tomlin 1754cfc1d277SAaron Tomlin /* 1755cfc1d277SAaron Tomlin * The code assumes that section 0 has a length of zero and 1756cfc1d277SAaron Tomlin * an addr of zero, so check for it. 1757cfc1d277SAaron Tomlin */ 1758cfc1d277SAaron Tomlin if (info->sechdrs[0].sh_type != SHT_NULL 1759cfc1d277SAaron Tomlin || info->sechdrs[0].sh_size != 0 1760cfc1d277SAaron Tomlin || info->sechdrs[0].sh_addr != 0) { 1761cfc1d277SAaron Tomlin pr_err("ELF Spec violation: section 0 type(%d)!=SH_NULL or non-zero len or addr\n", 1762cfc1d277SAaron Tomlin info->sechdrs[0].sh_type); 1763cfc1d277SAaron Tomlin goto no_exec; 1764cfc1d277SAaron Tomlin } 1765cfc1d277SAaron Tomlin 1766cfc1d277SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 1767cfc1d277SAaron Tomlin shdr = &info->sechdrs[i]; 1768cfc1d277SAaron Tomlin switch (shdr->sh_type) { 1769cfc1d277SAaron Tomlin case SHT_NULL: 1770cfc1d277SAaron Tomlin case SHT_NOBITS: 1771cfc1d277SAaron Tomlin continue; 1772cfc1d277SAaron Tomlin case SHT_SYMTAB: 1773cfc1d277SAaron Tomlin if (shdr->sh_link == SHN_UNDEF 1774cfc1d277SAaron Tomlin || shdr->sh_link >= info->hdr->e_shnum) { 1775cfc1d277SAaron Tomlin pr_err("Invalid ELF sh_link!=SHN_UNDEF(%d) or (sh_link(%d) >= hdr->e_shnum(%d)\n", 1776cfc1d277SAaron Tomlin shdr->sh_link, shdr->sh_link, 1777cfc1d277SAaron Tomlin info->hdr->e_shnum); 1778cfc1d277SAaron Tomlin goto no_exec; 1779cfc1d277SAaron Tomlin } 17801bb49db9SLuis Chamberlain num_sym_secs++; 17811bb49db9SLuis Chamberlain sym_idx = i; 1782cfc1d277SAaron Tomlin fallthrough; 1783cfc1d277SAaron Tomlin default: 1784cfc1d277SAaron Tomlin err = validate_section_offset(info, shdr); 1785cfc1d277SAaron Tomlin if (err < 0) { 1786cfc1d277SAaron Tomlin pr_err("Invalid ELF section in module (section %u type %u)\n", 1787cfc1d277SAaron Tomlin i, shdr->sh_type); 1788cfc1d277SAaron Tomlin return err; 1789cfc1d277SAaron Tomlin } 179046752820SLuis Chamberlain if (strcmp(info->secstrings + shdr->sh_name, 179146752820SLuis Chamberlain ".gnu.linkonce.this_module") == 0) { 179246752820SLuis Chamberlain num_mod_secs++; 179346752820SLuis Chamberlain mod_idx = i; 17941bb49db9SLuis Chamberlain } else if (strcmp(info->secstrings + shdr->sh_name, 17951bb49db9SLuis Chamberlain ".modinfo") == 0) { 17961bb49db9SLuis Chamberlain num_info_secs++; 17971bb49db9SLuis Chamberlain info_idx = i; 179846752820SLuis Chamberlain } 1799cfc1d277SAaron Tomlin 1800cfc1d277SAaron Tomlin if (shdr->sh_flags & SHF_ALLOC) { 1801cfc1d277SAaron Tomlin if (shdr->sh_name >= strhdr->sh_size) { 1802cfc1d277SAaron Tomlin pr_err("Invalid ELF section name in module (section %u type %u)\n", 1803cfc1d277SAaron Tomlin i, shdr->sh_type); 1804cfc1d277SAaron Tomlin return -ENOEXEC; 1805cfc1d277SAaron Tomlin } 1806cfc1d277SAaron Tomlin } 1807cfc1d277SAaron Tomlin break; 1808cfc1d277SAaron Tomlin } 1809cfc1d277SAaron Tomlin } 1810cfc1d277SAaron Tomlin 18111bb49db9SLuis Chamberlain if (num_info_secs > 1) { 18121bb49db9SLuis Chamberlain pr_err("Only one .modinfo section must exist.\n"); 18131bb49db9SLuis Chamberlain goto no_exec; 18141bb49db9SLuis Chamberlain } else if (num_info_secs == 1) { 18151bb49db9SLuis Chamberlain /* Try to find a name early so we can log errors with a module name */ 18161bb49db9SLuis Chamberlain info->index.info = info_idx; 18171bb49db9SLuis Chamberlain info->name = get_modinfo(info, "name"); 18181bb49db9SLuis Chamberlain } 18191bb49db9SLuis Chamberlain 18201bb49db9SLuis Chamberlain if (num_sym_secs != 1) { 18211bb49db9SLuis Chamberlain pr_warn("%s: module has no symbols (stripped?)\n", 18221bb49db9SLuis Chamberlain info->name ?: "(missing .modinfo section or name field)"); 18231bb49db9SLuis Chamberlain goto no_exec; 18241bb49db9SLuis Chamberlain } 18251bb49db9SLuis Chamberlain 18261bb49db9SLuis Chamberlain /* Sets internal symbols and strings. */ 18271bb49db9SLuis Chamberlain info->index.sym = sym_idx; 18281bb49db9SLuis Chamberlain shdr = &info->sechdrs[sym_idx]; 18291bb49db9SLuis Chamberlain info->index.str = shdr->sh_link; 18301bb49db9SLuis Chamberlain info->strtab = (char *)info->hdr + info->sechdrs[info->index.str].sh_offset; 18311bb49db9SLuis Chamberlain 183246752820SLuis Chamberlain /* 183346752820SLuis Chamberlain * The ".gnu.linkonce.this_module" ELF section is special. It is 183446752820SLuis Chamberlain * what modpost uses to refer to __this_module and let's use rely 183546752820SLuis Chamberlain * on THIS_MODULE to point to &__this_module properly. The kernel's 183646752820SLuis Chamberlain * modpost declares it on each modules's *.mod.c file. If the struct 183746752820SLuis Chamberlain * module of the kernel changes a full kernel rebuild is required. 183846752820SLuis Chamberlain * 183946752820SLuis Chamberlain * We have a few expectaions for this special section, the following 184046752820SLuis Chamberlain * code validates all this for us: 184146752820SLuis Chamberlain * 184246752820SLuis Chamberlain * o Only one section must exist 184346752820SLuis Chamberlain * o We expect the kernel to always have to allocate it: SHF_ALLOC 184446752820SLuis Chamberlain * o The section size must match the kernel's run time's struct module 184546752820SLuis Chamberlain * size 184646752820SLuis Chamberlain */ 184746752820SLuis Chamberlain if (num_mod_secs != 1) { 18481bb49db9SLuis Chamberlain pr_err("module %s: Only one .gnu.linkonce.this_module section must exist.\n", 18491bb49db9SLuis Chamberlain info->name ?: "(missing .modinfo section or name field)"); 185046752820SLuis Chamberlain goto no_exec; 185146752820SLuis Chamberlain } 185246752820SLuis Chamberlain 185346752820SLuis Chamberlain shdr = &info->sechdrs[mod_idx]; 185446752820SLuis Chamberlain 185546752820SLuis Chamberlain /* 185646752820SLuis Chamberlain * This is already implied on the switch above, however let's be 185746752820SLuis Chamberlain * pedantic about it. 185846752820SLuis Chamberlain */ 185946752820SLuis Chamberlain if (shdr->sh_type == SHT_NOBITS) { 18601bb49db9SLuis Chamberlain pr_err("module %s: .gnu.linkonce.this_module section must have a size set\n", 18611bb49db9SLuis Chamberlain info->name ?: "(missing .modinfo section or name field)"); 186246752820SLuis Chamberlain goto no_exec; 186346752820SLuis Chamberlain } 186446752820SLuis Chamberlain 186546752820SLuis Chamberlain if (!(shdr->sh_flags & SHF_ALLOC)) { 18661bb49db9SLuis Chamberlain pr_err("module %s: .gnu.linkonce.this_module must occupy memory during process execution\n", 18671bb49db9SLuis Chamberlain info->name ?: "(missing .modinfo section or name field)"); 186846752820SLuis Chamberlain goto no_exec; 186946752820SLuis Chamberlain } 187046752820SLuis Chamberlain 187146752820SLuis Chamberlain if (shdr->sh_size != sizeof(struct module)) { 18721bb49db9SLuis Chamberlain pr_err("module %s: .gnu.linkonce.this_module section size must match the kernel's built struct module size at run time\n", 18731bb49db9SLuis Chamberlain info->name ?: "(missing .modinfo section or name field)"); 187446752820SLuis Chamberlain goto no_exec; 187546752820SLuis Chamberlain } 187646752820SLuis Chamberlain 187746752820SLuis Chamberlain info->index.mod = mod_idx; 187846752820SLuis Chamberlain 187946752820SLuis Chamberlain /* This is temporary: point mod into copy of data. */ 188046752820SLuis Chamberlain info->mod = (void *)info->hdr + shdr->sh_offset; 188146752820SLuis Chamberlain 18821bb49db9SLuis Chamberlain /* 18831bb49db9SLuis Chamberlain * If we didn't load the .modinfo 'name' field earlier, fall back to 18841bb49db9SLuis Chamberlain * on-disk struct mod 'name' field. 18851bb49db9SLuis Chamberlain */ 18861bb49db9SLuis Chamberlain if (!info->name) 18871bb49db9SLuis Chamberlain info->name = info->mod->name; 18881bb49db9SLuis Chamberlain 18893d40bb90SLuis Chamberlain if (flags & MODULE_INIT_IGNORE_MODVERSIONS) 18903d40bb90SLuis Chamberlain info->index.vers = 0; /* Pretend no __versions section! */ 18913d40bb90SLuis Chamberlain else 18923d40bb90SLuis Chamberlain info->index.vers = find_sec(info, "__versions"); 18933d40bb90SLuis Chamberlain 18943d40bb90SLuis Chamberlain info->index.pcpu = find_pcpusec(info); 18953d40bb90SLuis Chamberlain 1896cfc1d277SAaron Tomlin return 0; 1897cfc1d277SAaron Tomlin 1898cfc1d277SAaron Tomlin no_exec: 1899cfc1d277SAaron Tomlin return -ENOEXEC; 1900cfc1d277SAaron Tomlin } 1901cfc1d277SAaron Tomlin 1902cfc1d277SAaron Tomlin #define COPY_CHUNK_SIZE (16*PAGE_SIZE) 1903cfc1d277SAaron Tomlin 1904cfc1d277SAaron Tomlin static int copy_chunked_from_user(void *dst, const void __user *usrc, unsigned long len) 1905cfc1d277SAaron Tomlin { 1906cfc1d277SAaron Tomlin do { 1907cfc1d277SAaron Tomlin unsigned long n = min(len, COPY_CHUNK_SIZE); 1908cfc1d277SAaron Tomlin 1909cfc1d277SAaron Tomlin if (copy_from_user(dst, usrc, n) != 0) 1910cfc1d277SAaron Tomlin return -EFAULT; 1911cfc1d277SAaron Tomlin cond_resched(); 1912cfc1d277SAaron Tomlin dst += n; 1913cfc1d277SAaron Tomlin usrc += n; 1914cfc1d277SAaron Tomlin len -= n; 1915cfc1d277SAaron Tomlin } while (len); 1916cfc1d277SAaron Tomlin return 0; 1917cfc1d277SAaron Tomlin } 1918cfc1d277SAaron Tomlin 1919cfc1d277SAaron Tomlin static int check_modinfo_livepatch(struct module *mod, struct load_info *info) 1920cfc1d277SAaron Tomlin { 19211be9473eSAaron Tomlin if (!get_modinfo(info, "livepatch")) 19221be9473eSAaron Tomlin /* Nothing more to do */ 19231be9473eSAaron Tomlin return 0; 19241be9473eSAaron Tomlin 1925ed52cabeSLuis Chamberlain if (set_livepatch_module(mod)) 1926cfc1d277SAaron Tomlin return 0; 19271be9473eSAaron Tomlin 1928cfc1d277SAaron Tomlin pr_err("%s: module is marked as livepatch module, but livepatch support is disabled", 1929cfc1d277SAaron Tomlin mod->name); 1930cfc1d277SAaron Tomlin return -ENOEXEC; 1931cfc1d277SAaron Tomlin } 1932cfc1d277SAaron Tomlin 1933cfc1d277SAaron Tomlin static void check_modinfo_retpoline(struct module *mod, struct load_info *info) 1934cfc1d277SAaron Tomlin { 1935cfc1d277SAaron Tomlin if (retpoline_module_ok(get_modinfo(info, "retpoline"))) 1936cfc1d277SAaron Tomlin return; 1937cfc1d277SAaron Tomlin 1938cfc1d277SAaron Tomlin pr_warn("%s: loading module not compiled with retpoline compiler.\n", 1939cfc1d277SAaron Tomlin mod->name); 1940cfc1d277SAaron Tomlin } 1941cfc1d277SAaron Tomlin 1942cfc1d277SAaron Tomlin /* Sets info->hdr and info->len. */ 1943cfc1d277SAaron Tomlin static int copy_module_from_user(const void __user *umod, unsigned long len, 1944cfc1d277SAaron Tomlin struct load_info *info) 1945cfc1d277SAaron Tomlin { 1946cfc1d277SAaron Tomlin int err; 1947cfc1d277SAaron Tomlin 1948cfc1d277SAaron Tomlin info->len = len; 1949cfc1d277SAaron Tomlin if (info->len < sizeof(*(info->hdr))) 1950cfc1d277SAaron Tomlin return -ENOEXEC; 1951cfc1d277SAaron Tomlin 1952cfc1d277SAaron Tomlin err = security_kernel_load_data(LOADING_MODULE, true); 1953cfc1d277SAaron Tomlin if (err) 1954cfc1d277SAaron Tomlin return err; 1955cfc1d277SAaron Tomlin 1956cfc1d277SAaron Tomlin /* Suck in entire file: we'll want most of it. */ 1957cfc1d277SAaron Tomlin info->hdr = __vmalloc(info->len, GFP_KERNEL | __GFP_NOWARN); 1958cfc1d277SAaron Tomlin if (!info->hdr) 1959cfc1d277SAaron Tomlin return -ENOMEM; 1960cfc1d277SAaron Tomlin 1961cfc1d277SAaron Tomlin if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) { 1962cfc1d277SAaron Tomlin err = -EFAULT; 1963cfc1d277SAaron Tomlin goto out; 1964cfc1d277SAaron Tomlin } 1965cfc1d277SAaron Tomlin 1966cfc1d277SAaron Tomlin err = security_kernel_post_load_data((char *)info->hdr, info->len, 1967cfc1d277SAaron Tomlin LOADING_MODULE, "init_module"); 1968cfc1d277SAaron Tomlin out: 1969cfc1d277SAaron Tomlin if (err) 1970cfc1d277SAaron Tomlin vfree(info->hdr); 1971cfc1d277SAaron Tomlin 1972cfc1d277SAaron Tomlin return err; 1973cfc1d277SAaron Tomlin } 1974cfc1d277SAaron Tomlin 1975cfc1d277SAaron Tomlin static void free_copy(struct load_info *info, int flags) 1976cfc1d277SAaron Tomlin { 1977cfc1d277SAaron Tomlin if (flags & MODULE_INIT_COMPRESSED_FILE) 1978cfc1d277SAaron Tomlin module_decompress_cleanup(info); 1979cfc1d277SAaron Tomlin else 1980cfc1d277SAaron Tomlin vfree(info->hdr); 1981cfc1d277SAaron Tomlin } 1982cfc1d277SAaron Tomlin 1983cfc1d277SAaron Tomlin static int rewrite_section_headers(struct load_info *info, int flags) 1984cfc1d277SAaron Tomlin { 1985cfc1d277SAaron Tomlin unsigned int i; 1986cfc1d277SAaron Tomlin 1987cfc1d277SAaron Tomlin /* This should always be true, but let's be sure. */ 1988cfc1d277SAaron Tomlin info->sechdrs[0].sh_addr = 0; 1989cfc1d277SAaron Tomlin 1990cfc1d277SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 1991cfc1d277SAaron Tomlin Elf_Shdr *shdr = &info->sechdrs[i]; 1992cfc1d277SAaron Tomlin 1993cfc1d277SAaron Tomlin /* 1994cfc1d277SAaron Tomlin * Mark all sections sh_addr with their address in the 1995cfc1d277SAaron Tomlin * temporary image. 1996cfc1d277SAaron Tomlin */ 1997cfc1d277SAaron Tomlin shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset; 1998cfc1d277SAaron Tomlin 1999cfc1d277SAaron Tomlin } 2000cfc1d277SAaron Tomlin 2001cfc1d277SAaron Tomlin /* Track but don't keep modinfo and version sections. */ 2002cfc1d277SAaron Tomlin info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC; 2003cfc1d277SAaron Tomlin info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC; 2004cfc1d277SAaron Tomlin 2005cfc1d277SAaron Tomlin return 0; 2006cfc1d277SAaron Tomlin } 2007cfc1d277SAaron Tomlin 2008cfc1d277SAaron Tomlin /* 2009437c1f9cSLuis Chamberlain * These calls taint the kernel depending certain module circumstances */ 2010437c1f9cSLuis Chamberlain static void module_augment_kernel_taints(struct module *mod, struct load_info *info) 2011437c1f9cSLuis Chamberlain { 201272f08b3cSLuis Chamberlain int prev_taint = test_taint(TAINT_PROPRIETARY_MODULE); 201372f08b3cSLuis Chamberlain 2014437c1f9cSLuis Chamberlain if (!get_modinfo(info, "intree")) { 2015437c1f9cSLuis Chamberlain if (!test_taint(TAINT_OOT_MODULE)) 2016437c1f9cSLuis Chamberlain pr_warn("%s: loading out-of-tree module taints kernel.\n", 2017437c1f9cSLuis Chamberlain mod->name); 2018437c1f9cSLuis Chamberlain add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); 2019437c1f9cSLuis Chamberlain } 2020437c1f9cSLuis Chamberlain 2021437c1f9cSLuis Chamberlain check_modinfo_retpoline(mod, info); 2022437c1f9cSLuis Chamberlain 2023437c1f9cSLuis Chamberlain if (get_modinfo(info, "staging")) { 2024437c1f9cSLuis Chamberlain add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK); 2025437c1f9cSLuis Chamberlain pr_warn("%s: module is from the staging directory, the quality " 2026437c1f9cSLuis Chamberlain "is unknown, you have been warned.\n", mod->name); 2027437c1f9cSLuis Chamberlain } 2028437c1f9cSLuis Chamberlain 2029437c1f9cSLuis Chamberlain if (is_livepatch_module(mod)) { 2030437c1f9cSLuis Chamberlain add_taint_module(mod, TAINT_LIVEPATCH, LOCKDEP_STILL_OK); 2031437c1f9cSLuis Chamberlain pr_notice_once("%s: tainting kernel with TAINT_LIVEPATCH\n", 2032437c1f9cSLuis Chamberlain mod->name); 2033437c1f9cSLuis Chamberlain } 2034437c1f9cSLuis Chamberlain 2035437c1f9cSLuis Chamberlain module_license_taint_check(mod, get_modinfo(info, "license")); 2036437c1f9cSLuis Chamberlain 2037437c1f9cSLuis Chamberlain if (get_modinfo(info, "test")) { 2038437c1f9cSLuis Chamberlain if (!test_taint(TAINT_TEST)) 2039437c1f9cSLuis Chamberlain pr_warn("%s: loading test module taints kernel.\n", 2040437c1f9cSLuis Chamberlain mod->name); 2041437c1f9cSLuis Chamberlain add_taint_module(mod, TAINT_TEST, LOCKDEP_STILL_OK); 2042437c1f9cSLuis Chamberlain } 2043c3bbf62eSLuis Chamberlain #ifdef CONFIG_MODULE_SIG 2044c3bbf62eSLuis Chamberlain mod->sig_ok = info->sig_ok; 2045c3bbf62eSLuis Chamberlain if (!mod->sig_ok) { 2046c3bbf62eSLuis Chamberlain pr_notice_once("%s: module verification failed: signature " 2047c3bbf62eSLuis Chamberlain "and/or required key missing - tainting " 2048c3bbf62eSLuis Chamberlain "kernel\n", mod->name); 2049c3bbf62eSLuis Chamberlain add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK); 2050c3bbf62eSLuis Chamberlain } 2051c3bbf62eSLuis Chamberlain #endif 205272f08b3cSLuis Chamberlain 205372f08b3cSLuis Chamberlain /* 205472f08b3cSLuis Chamberlain * ndiswrapper is under GPL by itself, but loads proprietary modules. 205572f08b3cSLuis Chamberlain * Don't use add_taint_module(), as it would prevent ndiswrapper from 205672f08b3cSLuis Chamberlain * using GPL-only symbols it needs. 205772f08b3cSLuis Chamberlain */ 205872f08b3cSLuis Chamberlain if (strcmp(mod->name, "ndiswrapper") == 0) 205972f08b3cSLuis Chamberlain add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE); 206072f08b3cSLuis Chamberlain 206172f08b3cSLuis Chamberlain /* driverloader was caught wrongly pretending to be under GPL */ 206272f08b3cSLuis Chamberlain if (strcmp(mod->name, "driverloader") == 0) 206372f08b3cSLuis Chamberlain add_taint_module(mod, TAINT_PROPRIETARY_MODULE, 206472f08b3cSLuis Chamberlain LOCKDEP_NOW_UNRELIABLE); 206572f08b3cSLuis Chamberlain 206672f08b3cSLuis Chamberlain /* lve claims to be GPL but upstream won't provide source */ 206772f08b3cSLuis Chamberlain if (strcmp(mod->name, "lve") == 0) 206872f08b3cSLuis Chamberlain add_taint_module(mod, TAINT_PROPRIETARY_MODULE, 206972f08b3cSLuis Chamberlain LOCKDEP_NOW_UNRELIABLE); 207072f08b3cSLuis Chamberlain 207172f08b3cSLuis Chamberlain if (!prev_taint && test_taint(TAINT_PROPRIETARY_MODULE)) 207272f08b3cSLuis Chamberlain pr_warn("%s: module license taints kernel.\n", mod->name); 207372f08b3cSLuis Chamberlain 2074437c1f9cSLuis Chamberlain } 2075437c1f9cSLuis Chamberlain 2076cfc1d277SAaron Tomlin static int check_modinfo(struct module *mod, struct load_info *info, int flags) 2077cfc1d277SAaron Tomlin { 2078cfc1d277SAaron Tomlin const char *modmagic = get_modinfo(info, "vermagic"); 2079cfc1d277SAaron Tomlin int err; 2080cfc1d277SAaron Tomlin 2081cfc1d277SAaron Tomlin if (flags & MODULE_INIT_IGNORE_VERMAGIC) 2082cfc1d277SAaron Tomlin modmagic = NULL; 2083cfc1d277SAaron Tomlin 2084cfc1d277SAaron Tomlin /* This is allowed: modprobe --force will invalidate it. */ 2085cfc1d277SAaron Tomlin if (!modmagic) { 2086cfc1d277SAaron Tomlin err = try_to_force_load(mod, "bad vermagic"); 2087cfc1d277SAaron Tomlin if (err) 2088cfc1d277SAaron Tomlin return err; 2089cfc1d277SAaron Tomlin } else if (!same_magic(modmagic, vermagic, info->index.vers)) { 2090cfc1d277SAaron Tomlin pr_err("%s: version magic '%s' should be '%s'\n", 2091cfc1d277SAaron Tomlin info->name, modmagic, vermagic); 2092cfc1d277SAaron Tomlin return -ENOEXEC; 2093cfc1d277SAaron Tomlin } 2094cfc1d277SAaron Tomlin 2095cfc1d277SAaron Tomlin err = check_modinfo_livepatch(mod, info); 2096cfc1d277SAaron Tomlin if (err) 2097cfc1d277SAaron Tomlin return err; 2098cfc1d277SAaron Tomlin 2099cfc1d277SAaron Tomlin return 0; 2100cfc1d277SAaron Tomlin } 2101cfc1d277SAaron Tomlin 2102cfc1d277SAaron Tomlin static int find_module_sections(struct module *mod, struct load_info *info) 2103cfc1d277SAaron Tomlin { 2104cfc1d277SAaron Tomlin mod->kp = section_objs(info, "__param", 2105cfc1d277SAaron Tomlin sizeof(*mod->kp), &mod->num_kp); 2106cfc1d277SAaron Tomlin mod->syms = section_objs(info, "__ksymtab", 2107cfc1d277SAaron Tomlin sizeof(*mod->syms), &mod->num_syms); 2108cfc1d277SAaron Tomlin mod->crcs = section_addr(info, "__kcrctab"); 2109cfc1d277SAaron Tomlin mod->gpl_syms = section_objs(info, "__ksymtab_gpl", 2110cfc1d277SAaron Tomlin sizeof(*mod->gpl_syms), 2111cfc1d277SAaron Tomlin &mod->num_gpl_syms); 2112cfc1d277SAaron Tomlin mod->gpl_crcs = section_addr(info, "__kcrctab_gpl"); 2113cfc1d277SAaron Tomlin 2114cfc1d277SAaron Tomlin #ifdef CONFIG_CONSTRUCTORS 2115cfc1d277SAaron Tomlin mod->ctors = section_objs(info, ".ctors", 2116cfc1d277SAaron Tomlin sizeof(*mod->ctors), &mod->num_ctors); 2117cfc1d277SAaron Tomlin if (!mod->ctors) 2118cfc1d277SAaron Tomlin mod->ctors = section_objs(info, ".init_array", 2119cfc1d277SAaron Tomlin sizeof(*mod->ctors), &mod->num_ctors); 2120cfc1d277SAaron Tomlin else if (find_sec(info, ".init_array")) { 2121cfc1d277SAaron Tomlin /* 2122cfc1d277SAaron Tomlin * This shouldn't happen with same compiler and binutils 2123cfc1d277SAaron Tomlin * building all parts of the module. 2124cfc1d277SAaron Tomlin */ 2125cfc1d277SAaron Tomlin pr_warn("%s: has both .ctors and .init_array.\n", 2126cfc1d277SAaron Tomlin mod->name); 2127cfc1d277SAaron Tomlin return -EINVAL; 2128cfc1d277SAaron Tomlin } 2129cfc1d277SAaron Tomlin #endif 2130cfc1d277SAaron Tomlin 2131cfc1d277SAaron Tomlin mod->noinstr_text_start = section_objs(info, ".noinstr.text", 1, 2132cfc1d277SAaron Tomlin &mod->noinstr_text_size); 2133cfc1d277SAaron Tomlin 2134cfc1d277SAaron Tomlin #ifdef CONFIG_TRACEPOINTS 2135cfc1d277SAaron Tomlin mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs", 2136cfc1d277SAaron Tomlin sizeof(*mod->tracepoints_ptrs), 2137cfc1d277SAaron Tomlin &mod->num_tracepoints); 2138cfc1d277SAaron Tomlin #endif 2139cfc1d277SAaron Tomlin #ifdef CONFIG_TREE_SRCU 2140cfc1d277SAaron Tomlin mod->srcu_struct_ptrs = section_objs(info, "___srcu_struct_ptrs", 2141cfc1d277SAaron Tomlin sizeof(*mod->srcu_struct_ptrs), 2142cfc1d277SAaron Tomlin &mod->num_srcu_structs); 2143cfc1d277SAaron Tomlin #endif 2144cfc1d277SAaron Tomlin #ifdef CONFIG_BPF_EVENTS 2145cfc1d277SAaron Tomlin mod->bpf_raw_events = section_objs(info, "__bpf_raw_tp_map", 2146cfc1d277SAaron Tomlin sizeof(*mod->bpf_raw_events), 2147cfc1d277SAaron Tomlin &mod->num_bpf_raw_events); 2148cfc1d277SAaron Tomlin #endif 2149cfc1d277SAaron Tomlin #ifdef CONFIG_DEBUG_INFO_BTF_MODULES 2150cfc1d277SAaron Tomlin mod->btf_data = any_section_objs(info, ".BTF", 1, &mod->btf_data_size); 2151cfc1d277SAaron Tomlin #endif 2152cfc1d277SAaron Tomlin #ifdef CONFIG_JUMP_LABEL 2153cfc1d277SAaron Tomlin mod->jump_entries = section_objs(info, "__jump_table", 2154cfc1d277SAaron Tomlin sizeof(*mod->jump_entries), 2155cfc1d277SAaron Tomlin &mod->num_jump_entries); 2156cfc1d277SAaron Tomlin #endif 2157cfc1d277SAaron Tomlin #ifdef CONFIG_EVENT_TRACING 2158cfc1d277SAaron Tomlin mod->trace_events = section_objs(info, "_ftrace_events", 2159cfc1d277SAaron Tomlin sizeof(*mod->trace_events), 2160cfc1d277SAaron Tomlin &mod->num_trace_events); 2161cfc1d277SAaron Tomlin mod->trace_evals = section_objs(info, "_ftrace_eval_map", 2162cfc1d277SAaron Tomlin sizeof(*mod->trace_evals), 2163cfc1d277SAaron Tomlin &mod->num_trace_evals); 2164cfc1d277SAaron Tomlin #endif 2165cfc1d277SAaron Tomlin #ifdef CONFIG_TRACING 2166cfc1d277SAaron Tomlin mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt", 2167cfc1d277SAaron Tomlin sizeof(*mod->trace_bprintk_fmt_start), 2168cfc1d277SAaron Tomlin &mod->num_trace_bprintk_fmt); 2169cfc1d277SAaron Tomlin #endif 2170cfc1d277SAaron Tomlin #ifdef CONFIG_FTRACE_MCOUNT_RECORD 2171cfc1d277SAaron Tomlin /* sechdrs[0].sh_size is always zero */ 2172cfc1d277SAaron Tomlin mod->ftrace_callsites = section_objs(info, FTRACE_CALLSITE_SECTION, 2173cfc1d277SAaron Tomlin sizeof(*mod->ftrace_callsites), 2174cfc1d277SAaron Tomlin &mod->num_ftrace_callsites); 2175cfc1d277SAaron Tomlin #endif 2176cfc1d277SAaron Tomlin #ifdef CONFIG_FUNCTION_ERROR_INJECTION 2177cfc1d277SAaron Tomlin mod->ei_funcs = section_objs(info, "_error_injection_whitelist", 2178cfc1d277SAaron Tomlin sizeof(*mod->ei_funcs), 2179cfc1d277SAaron Tomlin &mod->num_ei_funcs); 2180cfc1d277SAaron Tomlin #endif 2181cfc1d277SAaron Tomlin #ifdef CONFIG_KPROBES 2182cfc1d277SAaron Tomlin mod->kprobes_text_start = section_objs(info, ".kprobes.text", 1, 2183cfc1d277SAaron Tomlin &mod->kprobes_text_size); 2184cfc1d277SAaron Tomlin mod->kprobe_blacklist = section_objs(info, "_kprobe_blacklist", 2185cfc1d277SAaron Tomlin sizeof(unsigned long), 2186cfc1d277SAaron Tomlin &mod->num_kprobe_blacklist); 2187cfc1d277SAaron Tomlin #endif 2188cfc1d277SAaron Tomlin #ifdef CONFIG_PRINTK_INDEX 2189cfc1d277SAaron Tomlin mod->printk_index_start = section_objs(info, ".printk_index", 2190cfc1d277SAaron Tomlin sizeof(*mod->printk_index_start), 2191cfc1d277SAaron Tomlin &mod->printk_index_size); 2192cfc1d277SAaron Tomlin #endif 2193cfc1d277SAaron Tomlin #ifdef CONFIG_HAVE_STATIC_CALL_INLINE 2194cfc1d277SAaron Tomlin mod->static_call_sites = section_objs(info, ".static_call_sites", 2195cfc1d277SAaron Tomlin sizeof(*mod->static_call_sites), 2196cfc1d277SAaron Tomlin &mod->num_static_call_sites); 2197cfc1d277SAaron Tomlin #endif 219841a55567SDavid Gow #if IS_ENABLED(CONFIG_KUNIT) 21993d6e4462SJeremy Kerr mod->kunit_suites = section_objs(info, ".kunit_test_suites", 22003d6e4462SJeremy Kerr sizeof(*mod->kunit_suites), 22013d6e4462SJeremy Kerr &mod->num_kunit_suites); 22023d6e4462SJeremy Kerr #endif 22033d6e4462SJeremy Kerr 2204cfc1d277SAaron Tomlin mod->extable = section_objs(info, "__ex_table", 2205cfc1d277SAaron Tomlin sizeof(*mod->extable), &mod->num_exentries); 2206cfc1d277SAaron Tomlin 2207cfc1d277SAaron Tomlin if (section_addr(info, "__obsparm")) 2208cfc1d277SAaron Tomlin pr_warn("%s: Ignoring obsolete parameters\n", mod->name); 2209cfc1d277SAaron Tomlin 22107deabd67SJason Baron #ifdef CONFIG_DYNAMIC_DEBUG_CORE 22117deabd67SJason Baron mod->dyndbg_info.descs = section_objs(info, "__dyndbg", 22127deabd67SJason Baron sizeof(*mod->dyndbg_info.descs), 22137deabd67SJason Baron &mod->dyndbg_info.num_descs); 22147deabd67SJason Baron mod->dyndbg_info.classes = section_objs(info, "__dyndbg_classes", 22157deabd67SJason Baron sizeof(*mod->dyndbg_info.classes), 22167deabd67SJason Baron &mod->dyndbg_info.num_classes); 22177deabd67SJason Baron #endif 2218cfc1d277SAaron Tomlin 2219cfc1d277SAaron Tomlin return 0; 2220cfc1d277SAaron Tomlin } 2221cfc1d277SAaron Tomlin 2222cfc1d277SAaron Tomlin static int move_module(struct module *mod, struct load_info *info) 2223cfc1d277SAaron Tomlin { 2224cfc1d277SAaron Tomlin int i; 2225cfc1d277SAaron Tomlin void *ptr; 2226c7ee8aebSLuis Chamberlain enum mod_mem_type t = 0; 2227c7ee8aebSLuis Chamberlain int ret = -ENOMEM; 2228cfc1d277SAaron Tomlin 2229ac3b4328SSong Liu for_each_mod_mem_type(type) { 2230ac3b4328SSong Liu if (!mod->mem[type].size) { 2231ac3b4328SSong Liu mod->mem[type].base = NULL; 2232ac3b4328SSong Liu continue; 2233ac3b4328SSong Liu } 2234ac3b4328SSong Liu mod->mem[type].size = PAGE_ALIGN(mod->mem[type].size); 2235ac3b4328SSong Liu ptr = module_memory_alloc(mod->mem[type].size, type); 2236cfc1d277SAaron Tomlin /* 2237430bb0d1SLuis Chamberlain * The pointer to these blocks of memory are stored on the module 2238430bb0d1SLuis Chamberlain * structure and we keep that around so long as the module is 2239430bb0d1SLuis Chamberlain * around. We only free that memory when we unload the module. 2240430bb0d1SLuis Chamberlain * Just mark them as not being a leak then. The .init* ELF 2241430bb0d1SLuis Chamberlain * sections *do* get freed after boot so we *could* treat them 2242430bb0d1SLuis Chamberlain * slightly differently with kmemleak_ignore() and only grey 2243430bb0d1SLuis Chamberlain * them out as they work as typical memory allocations which 2244430bb0d1SLuis Chamberlain * *do* eventually get freed, but let's just keep things simple 2245430bb0d1SLuis Chamberlain * and avoid *any* false positives. 2246cfc1d277SAaron Tomlin */ 2247430bb0d1SLuis Chamberlain kmemleak_not_leak(ptr); 2248cfc1d277SAaron Tomlin if (!ptr) { 2249ac3b4328SSong Liu t = type; 2250ac3b4328SSong Liu goto out_enomem; 2251cfc1d277SAaron Tomlin } 2252ac3b4328SSong Liu memset(ptr, 0, mod->mem[type].size); 2253ac3b4328SSong Liu mod->mem[type].base = ptr; 225401dc0386SChristophe Leroy } 225501dc0386SChristophe Leroy 2256cfc1d277SAaron Tomlin /* Transfer each section which specifies SHF_ALLOC */ 22576ed81802SJim Cromie pr_debug("Final section addresses for %s:\n", mod->name); 2258cfc1d277SAaron Tomlin for (i = 0; i < info->hdr->e_shnum; i++) { 2259cfc1d277SAaron Tomlin void *dest; 2260cfc1d277SAaron Tomlin Elf_Shdr *shdr = &info->sechdrs[i]; 2261ac3b4328SSong Liu enum mod_mem_type type = shdr->sh_entsize >> SH_ENTSIZE_TYPE_SHIFT; 2262cfc1d277SAaron Tomlin 2263cfc1d277SAaron Tomlin if (!(shdr->sh_flags & SHF_ALLOC)) 2264cfc1d277SAaron Tomlin continue; 2265cfc1d277SAaron Tomlin 2266ac3b4328SSong Liu dest = mod->mem[type].base + (shdr->sh_entsize & SH_ENTSIZE_OFFSET_MASK); 2267cfc1d277SAaron Tomlin 2268c7ee8aebSLuis Chamberlain if (shdr->sh_type != SHT_NOBITS) { 2269c7ee8aebSLuis Chamberlain /* 2270c7ee8aebSLuis Chamberlain * Our ELF checker already validated this, but let's 2271c7ee8aebSLuis Chamberlain * be pedantic and make the goal clearer. We actually 2272c7ee8aebSLuis Chamberlain * end up copying over all modifications made to the 2273c7ee8aebSLuis Chamberlain * userspace copy of the entire struct module. 2274c7ee8aebSLuis Chamberlain */ 2275c7ee8aebSLuis Chamberlain if (i == info->index.mod && 2276c7ee8aebSLuis Chamberlain (WARN_ON_ONCE(shdr->sh_size != sizeof(struct module)))) { 2277c7ee8aebSLuis Chamberlain ret = -ENOEXEC; 2278c7ee8aebSLuis Chamberlain goto out_enomem; 2279c7ee8aebSLuis Chamberlain } 2280cfc1d277SAaron Tomlin memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); 2281c7ee8aebSLuis Chamberlain } 2282c7ee8aebSLuis Chamberlain /* 2283c7ee8aebSLuis Chamberlain * Update the userspace copy's ELF section address to point to 2284c7ee8aebSLuis Chamberlain * our newly allocated memory as a pure convenience so that 2285c7ee8aebSLuis Chamberlain * users of info can keep taking advantage and using the newly 2286c7ee8aebSLuis Chamberlain * minted official memory area. 2287c7ee8aebSLuis Chamberlain */ 2288cfc1d277SAaron Tomlin shdr->sh_addr = (unsigned long)dest; 228966a2301eSJim Cromie pr_debug("\t0x%lx 0x%.8lx %s\n", (long)shdr->sh_addr, 229066a2301eSJim Cromie (long)shdr->sh_size, info->secstrings + shdr->sh_name); 2291cfc1d277SAaron Tomlin } 2292cfc1d277SAaron Tomlin 2293cfc1d277SAaron Tomlin return 0; 2294ac3b4328SSong Liu out_enomem: 2295ac3b4328SSong Liu for (t--; t >= 0; t--) 2296ac3b4328SSong Liu module_memory_free(mod->mem[t].base, t); 2297c7ee8aebSLuis Chamberlain return ret; 2298cfc1d277SAaron Tomlin } 2299cfc1d277SAaron Tomlin 2300419e1a20SLuis Chamberlain static int check_export_symbol_versions(struct module *mod) 2301cfc1d277SAaron Tomlin { 2302cfc1d277SAaron Tomlin #ifdef CONFIG_MODVERSIONS 2303cfc1d277SAaron Tomlin if ((mod->num_syms && !mod->crcs) || 2304cfc1d277SAaron Tomlin (mod->num_gpl_syms && !mod->gpl_crcs)) { 2305cfc1d277SAaron Tomlin return try_to_force_load(mod, 2306cfc1d277SAaron Tomlin "no versions for exported symbols"); 2307cfc1d277SAaron Tomlin } 2308cfc1d277SAaron Tomlin #endif 2309cfc1d277SAaron Tomlin return 0; 2310cfc1d277SAaron Tomlin } 2311cfc1d277SAaron Tomlin 2312cfc1d277SAaron Tomlin static void flush_module_icache(const struct module *mod) 2313cfc1d277SAaron Tomlin { 2314cfc1d277SAaron Tomlin /* 2315cfc1d277SAaron Tomlin * Flush the instruction cache, since we've played with text. 2316cfc1d277SAaron Tomlin * Do it before processing of module parameters, so the module 2317cfc1d277SAaron Tomlin * can provide parameter accessor functions of its own. 2318cfc1d277SAaron Tomlin */ 2319ac3b4328SSong Liu for_each_mod_mem_type(type) { 2320ac3b4328SSong Liu const struct module_memory *mod_mem = &mod->mem[type]; 2321ac3b4328SSong Liu 2322ac3b4328SSong Liu if (mod_mem->size) { 2323ac3b4328SSong Liu flush_icache_range((unsigned long)mod_mem->base, 2324ac3b4328SSong Liu (unsigned long)mod_mem->base + mod_mem->size); 2325ac3b4328SSong Liu } 2326ac3b4328SSong Liu } 2327cfc1d277SAaron Tomlin } 2328cfc1d277SAaron Tomlin 2329f9231a99SNicholas Piggin bool __weak module_elf_check_arch(Elf_Ehdr *hdr) 2330f9231a99SNicholas Piggin { 2331f9231a99SNicholas Piggin return true; 2332f9231a99SNicholas Piggin } 2333f9231a99SNicholas Piggin 2334cfc1d277SAaron Tomlin int __weak module_frob_arch_sections(Elf_Ehdr *hdr, 2335cfc1d277SAaron Tomlin Elf_Shdr *sechdrs, 2336cfc1d277SAaron Tomlin char *secstrings, 2337cfc1d277SAaron Tomlin struct module *mod) 2338cfc1d277SAaron Tomlin { 2339cfc1d277SAaron Tomlin return 0; 2340cfc1d277SAaron Tomlin } 2341cfc1d277SAaron Tomlin 2342cfc1d277SAaron Tomlin /* module_blacklist is a comma-separated list of module names */ 2343cfc1d277SAaron Tomlin static char *module_blacklist; 2344cfc1d277SAaron Tomlin static bool blacklisted(const char *module_name) 2345cfc1d277SAaron Tomlin { 2346cfc1d277SAaron Tomlin const char *p; 2347cfc1d277SAaron Tomlin size_t len; 2348cfc1d277SAaron Tomlin 2349cfc1d277SAaron Tomlin if (!module_blacklist) 2350cfc1d277SAaron Tomlin return false; 2351cfc1d277SAaron Tomlin 2352cfc1d277SAaron Tomlin for (p = module_blacklist; *p; p += len) { 2353cfc1d277SAaron Tomlin len = strcspn(p, ","); 2354cfc1d277SAaron Tomlin if (strlen(module_name) == len && !memcmp(module_name, p, len)) 2355cfc1d277SAaron Tomlin return true; 2356cfc1d277SAaron Tomlin if (p[len] == ',') 2357cfc1d277SAaron Tomlin len++; 2358cfc1d277SAaron Tomlin } 2359cfc1d277SAaron Tomlin return false; 2360cfc1d277SAaron Tomlin } 2361cfc1d277SAaron Tomlin core_param(module_blacklist, module_blacklist, charp, 0400); 2362cfc1d277SAaron Tomlin 2363cfc1d277SAaron Tomlin static struct module *layout_and_allocate(struct load_info *info, int flags) 2364cfc1d277SAaron Tomlin { 2365cfc1d277SAaron Tomlin struct module *mod; 2366cfc1d277SAaron Tomlin unsigned int ndx; 2367cfc1d277SAaron Tomlin int err; 2368cfc1d277SAaron Tomlin 2369cfc1d277SAaron Tomlin /* Allow arches to frob section contents and sizes. */ 2370cfc1d277SAaron Tomlin err = module_frob_arch_sections(info->hdr, info->sechdrs, 2371cfc1d277SAaron Tomlin info->secstrings, info->mod); 2372cfc1d277SAaron Tomlin if (err < 0) 2373cfc1d277SAaron Tomlin return ERR_PTR(err); 2374cfc1d277SAaron Tomlin 2375cfc1d277SAaron Tomlin err = module_enforce_rwx_sections(info->hdr, info->sechdrs, 2376cfc1d277SAaron Tomlin info->secstrings, info->mod); 2377cfc1d277SAaron Tomlin if (err < 0) 2378cfc1d277SAaron Tomlin return ERR_PTR(err); 2379cfc1d277SAaron Tomlin 2380cfc1d277SAaron Tomlin /* We will do a special allocation for per-cpu sections later. */ 2381cfc1d277SAaron Tomlin info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC; 2382cfc1d277SAaron Tomlin 2383cfc1d277SAaron Tomlin /* 2384cfc1d277SAaron Tomlin * Mark ro_after_init section with SHF_RO_AFTER_INIT so that 2385cfc1d277SAaron Tomlin * layout_sections() can put it in the right place. 2386cfc1d277SAaron Tomlin * Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set. 2387cfc1d277SAaron Tomlin */ 2388cfc1d277SAaron Tomlin ndx = find_sec(info, ".data..ro_after_init"); 2389cfc1d277SAaron Tomlin if (ndx) 2390cfc1d277SAaron Tomlin info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; 2391cfc1d277SAaron Tomlin /* 2392cfc1d277SAaron Tomlin * Mark the __jump_table section as ro_after_init as well: these data 2393cfc1d277SAaron Tomlin * structures are never modified, with the exception of entries that 2394cfc1d277SAaron Tomlin * refer to code in the __init section, which are annotated as such 2395cfc1d277SAaron Tomlin * at module load time. 2396cfc1d277SAaron Tomlin */ 2397cfc1d277SAaron Tomlin ndx = find_sec(info, "__jump_table"); 2398cfc1d277SAaron Tomlin if (ndx) 2399cfc1d277SAaron Tomlin info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; 2400cfc1d277SAaron Tomlin 2401cfc1d277SAaron Tomlin /* 2402cfc1d277SAaron Tomlin * Determine total sizes, and put offsets in sh_entsize. For now 2403cfc1d277SAaron Tomlin * this is done generically; there doesn't appear to be any 2404cfc1d277SAaron Tomlin * special cases for the architectures. 2405cfc1d277SAaron Tomlin */ 2406cfc1d277SAaron Tomlin layout_sections(info->mod, info); 2407cfc1d277SAaron Tomlin layout_symtab(info->mod, info); 2408cfc1d277SAaron Tomlin 2409cfc1d277SAaron Tomlin /* Allocate and move to the final place */ 2410cfc1d277SAaron Tomlin err = move_module(info->mod, info); 2411cfc1d277SAaron Tomlin if (err) 2412cfc1d277SAaron Tomlin return ERR_PTR(err); 2413cfc1d277SAaron Tomlin 2414cfc1d277SAaron Tomlin /* Module has been copied to its final place now: return it. */ 2415cfc1d277SAaron Tomlin mod = (void *)info->sechdrs[info->index.mod].sh_addr; 2416cfc1d277SAaron Tomlin kmemleak_load_module(mod, info); 2417cfc1d277SAaron Tomlin return mod; 2418cfc1d277SAaron Tomlin } 2419cfc1d277SAaron Tomlin 2420cfc1d277SAaron Tomlin /* mod is no longer valid after this! */ 2421cfc1d277SAaron Tomlin static void module_deallocate(struct module *mod, struct load_info *info) 2422cfc1d277SAaron Tomlin { 2423cfc1d277SAaron Tomlin percpu_modfree(mod); 2424cfc1d277SAaron Tomlin module_arch_freeing_init(mod); 2425ac3b4328SSong Liu 2426ac3b4328SSong Liu free_mod_mem(mod); 2427cfc1d277SAaron Tomlin } 2428cfc1d277SAaron Tomlin 2429cfc1d277SAaron Tomlin int __weak module_finalize(const Elf_Ehdr *hdr, 2430cfc1d277SAaron Tomlin const Elf_Shdr *sechdrs, 2431cfc1d277SAaron Tomlin struct module *me) 2432cfc1d277SAaron Tomlin { 2433cfc1d277SAaron Tomlin return 0; 2434cfc1d277SAaron Tomlin } 2435cfc1d277SAaron Tomlin 2436cfc1d277SAaron Tomlin static int post_relocation(struct module *mod, const struct load_info *info) 2437cfc1d277SAaron Tomlin { 2438cfc1d277SAaron Tomlin /* Sort exception table now relocations are done. */ 2439cfc1d277SAaron Tomlin sort_extable(mod->extable, mod->extable + mod->num_exentries); 2440cfc1d277SAaron Tomlin 2441cfc1d277SAaron Tomlin /* Copy relocated percpu area over. */ 2442cfc1d277SAaron Tomlin percpu_modcopy(mod, (void *)info->sechdrs[info->index.pcpu].sh_addr, 2443cfc1d277SAaron Tomlin info->sechdrs[info->index.pcpu].sh_size); 2444cfc1d277SAaron Tomlin 2445cfc1d277SAaron Tomlin /* Setup kallsyms-specific fields. */ 2446cfc1d277SAaron Tomlin add_kallsyms(mod, info); 2447cfc1d277SAaron Tomlin 2448cfc1d277SAaron Tomlin /* Arch-specific module finalizing. */ 2449cfc1d277SAaron Tomlin return module_finalize(info->hdr, info->sechdrs, mod); 2450cfc1d277SAaron Tomlin } 2451cfc1d277SAaron Tomlin 2452cfc1d277SAaron Tomlin /* Call module constructors. */ 2453cfc1d277SAaron Tomlin static void do_mod_ctors(struct module *mod) 2454cfc1d277SAaron Tomlin { 2455cfc1d277SAaron Tomlin #ifdef CONFIG_CONSTRUCTORS 2456cfc1d277SAaron Tomlin unsigned long i; 2457cfc1d277SAaron Tomlin 2458cfc1d277SAaron Tomlin for (i = 0; i < mod->num_ctors; i++) 2459cfc1d277SAaron Tomlin mod->ctors[i](); 2460cfc1d277SAaron Tomlin #endif 2461cfc1d277SAaron Tomlin } 2462cfc1d277SAaron Tomlin 2463cfc1d277SAaron Tomlin /* For freeing module_init on success, in case kallsyms traversing */ 2464cfc1d277SAaron Tomlin struct mod_initfree { 2465cfc1d277SAaron Tomlin struct llist_node node; 2466ac3b4328SSong Liu void *init_text; 2467ac3b4328SSong Liu void *init_data; 2468ac3b4328SSong Liu void *init_rodata; 2469cfc1d277SAaron Tomlin }; 2470cfc1d277SAaron Tomlin 2471cfc1d277SAaron Tomlin static void do_free_init(struct work_struct *w) 2472cfc1d277SAaron Tomlin { 2473cfc1d277SAaron Tomlin struct llist_node *pos, *n, *list; 2474cfc1d277SAaron Tomlin struct mod_initfree *initfree; 2475cfc1d277SAaron Tomlin 2476cfc1d277SAaron Tomlin list = llist_del_all(&init_free_list); 2477cfc1d277SAaron Tomlin 2478cfc1d277SAaron Tomlin synchronize_rcu(); 2479cfc1d277SAaron Tomlin 2480cfc1d277SAaron Tomlin llist_for_each_safe(pos, n, list) { 2481cfc1d277SAaron Tomlin initfree = container_of(pos, struct mod_initfree, node); 2482ac3b4328SSong Liu module_memfree(initfree->init_text); 2483ac3b4328SSong Liu module_memfree(initfree->init_data); 2484ac3b4328SSong Liu module_memfree(initfree->init_rodata); 2485cfc1d277SAaron Tomlin kfree(initfree); 2486cfc1d277SAaron Tomlin } 2487cfc1d277SAaron Tomlin } 2488cfc1d277SAaron Tomlin 2489*8c61e3beSChangbin Du void flush_module_init_free_work(void) 2490*8c61e3beSChangbin Du { 2491*8c61e3beSChangbin Du flush_work(&init_free_wq); 2492*8c61e3beSChangbin Du } 2493*8c61e3beSChangbin Du 2494ae39e9edSSaravana Kannan #undef MODULE_PARAM_PREFIX 2495ae39e9edSSaravana Kannan #define MODULE_PARAM_PREFIX "module." 2496ae39e9edSSaravana Kannan /* Default value for module->async_probe_requested */ 2497ae39e9edSSaravana Kannan static bool async_probe; 2498ae39e9edSSaravana Kannan module_param(async_probe, bool, 0644); 2499ae39e9edSSaravana Kannan 2500cfc1d277SAaron Tomlin /* 2501cfc1d277SAaron Tomlin * This is where the real work happens. 2502cfc1d277SAaron Tomlin * 2503cfc1d277SAaron Tomlin * Keep it uninlined to provide a reliable breakpoint target, e.g. for the gdb 2504cfc1d277SAaron Tomlin * helper command 'lx-symbols'. 2505cfc1d277SAaron Tomlin */ 2506cfc1d277SAaron Tomlin static noinline int do_init_module(struct module *mod) 2507cfc1d277SAaron Tomlin { 2508cfc1d277SAaron Tomlin int ret = 0; 2509cfc1d277SAaron Tomlin struct mod_initfree *freeinit; 2510df3e764dSLuis Chamberlain #if defined(CONFIG_MODULE_STATS) 2511df3e764dSLuis Chamberlain unsigned int text_size = 0, total_size = 0; 2512df3e764dSLuis Chamberlain 2513df3e764dSLuis Chamberlain for_each_mod_mem_type(type) { 2514df3e764dSLuis Chamberlain const struct module_memory *mod_mem = &mod->mem[type]; 2515df3e764dSLuis Chamberlain if (mod_mem->size) { 2516df3e764dSLuis Chamberlain total_size += mod_mem->size; 2517df3e764dSLuis Chamberlain if (type == MOD_TEXT || type == MOD_INIT_TEXT) 2518df3e764dSLuis Chamberlain text_size += mod_mem->size; 2519df3e764dSLuis Chamberlain } 2520df3e764dSLuis Chamberlain } 2521df3e764dSLuis Chamberlain #endif 2522cfc1d277SAaron Tomlin 2523cfc1d277SAaron Tomlin freeinit = kmalloc(sizeof(*freeinit), GFP_KERNEL); 2524cfc1d277SAaron Tomlin if (!freeinit) { 2525cfc1d277SAaron Tomlin ret = -ENOMEM; 2526cfc1d277SAaron Tomlin goto fail; 2527cfc1d277SAaron Tomlin } 2528ac3b4328SSong Liu freeinit->init_text = mod->mem[MOD_INIT_TEXT].base; 2529ac3b4328SSong Liu freeinit->init_data = mod->mem[MOD_INIT_DATA].base; 2530ac3b4328SSong Liu freeinit->init_rodata = mod->mem[MOD_INIT_RODATA].base; 2531cfc1d277SAaron Tomlin 2532cfc1d277SAaron Tomlin do_mod_ctors(mod); 2533cfc1d277SAaron Tomlin /* Start the module */ 2534cfc1d277SAaron Tomlin if (mod->init != NULL) 2535cfc1d277SAaron Tomlin ret = do_one_initcall(mod->init); 2536cfc1d277SAaron Tomlin if (ret < 0) { 2537cfc1d277SAaron Tomlin goto fail_free_freeinit; 2538cfc1d277SAaron Tomlin } 2539cfc1d277SAaron Tomlin if (ret > 0) { 2540cfc1d277SAaron Tomlin pr_warn("%s: '%s'->init suspiciously returned %d, it should " 2541cfc1d277SAaron Tomlin "follow 0/-E convention\n" 2542cfc1d277SAaron Tomlin "%s: loading module anyway...\n", 2543cfc1d277SAaron Tomlin __func__, mod->name, ret, __func__); 2544cfc1d277SAaron Tomlin dump_stack(); 2545cfc1d277SAaron Tomlin } 2546cfc1d277SAaron Tomlin 2547cfc1d277SAaron Tomlin /* Now it's a first class citizen! */ 2548cfc1d277SAaron Tomlin mod->state = MODULE_STATE_LIVE; 2549cfc1d277SAaron Tomlin blocking_notifier_call_chain(&module_notify_list, 2550cfc1d277SAaron Tomlin MODULE_STATE_LIVE, mod); 2551cfc1d277SAaron Tomlin 2552cfc1d277SAaron Tomlin /* Delay uevent until module has finished its init routine */ 2553cfc1d277SAaron Tomlin kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); 2554cfc1d277SAaron Tomlin 2555cfc1d277SAaron Tomlin /* 2556cfc1d277SAaron Tomlin * We need to finish all async code before the module init sequence 2557cfc1d277SAaron Tomlin * is done. This has potential to deadlock if synchronous module 2558cfc1d277SAaron Tomlin * loading is requested from async (which is not allowed!). 2559cfc1d277SAaron Tomlin * 2560cfc1d277SAaron Tomlin * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous 2561cfc1d277SAaron Tomlin * request_module() from async workers") for more details. 2562cfc1d277SAaron Tomlin */ 2563cfc1d277SAaron Tomlin if (!mod->async_probe_requested) 2564cfc1d277SAaron Tomlin async_synchronize_full(); 2565cfc1d277SAaron Tomlin 2566ac3b4328SSong Liu ftrace_free_mem(mod, mod->mem[MOD_INIT_TEXT].base, 2567ac3b4328SSong Liu mod->mem[MOD_INIT_TEXT].base + mod->mem[MOD_INIT_TEXT].size); 2568cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 2569cfc1d277SAaron Tomlin /* Drop initial reference. */ 2570cfc1d277SAaron Tomlin module_put(mod); 2571cfc1d277SAaron Tomlin trim_init_extable(mod); 2572cfc1d277SAaron Tomlin #ifdef CONFIG_KALLSYMS 2573cfc1d277SAaron Tomlin /* Switch to core kallsyms now init is done: kallsyms may be walking! */ 2574cfc1d277SAaron Tomlin rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms); 2575cfc1d277SAaron Tomlin #endif 2576cfc1d277SAaron Tomlin module_enable_ro(mod, true); 2577cfc1d277SAaron Tomlin mod_tree_remove_init(mod); 2578cfc1d277SAaron Tomlin module_arch_freeing_init(mod); 2579ac3b4328SSong Liu for_class_mod_mem_type(type, init) { 2580ac3b4328SSong Liu mod->mem[type].base = NULL; 2581ac3b4328SSong Liu mod->mem[type].size = 0; 2582ac3b4328SSong Liu } 2583df3e764dSLuis Chamberlain 2584cfc1d277SAaron Tomlin #ifdef CONFIG_DEBUG_INFO_BTF_MODULES 2585cfc1d277SAaron Tomlin /* .BTF is not SHF_ALLOC and will get removed, so sanitize pointer */ 2586cfc1d277SAaron Tomlin mod->btf_data = NULL; 2587cfc1d277SAaron Tomlin #endif 2588cfc1d277SAaron Tomlin /* 2589cfc1d277SAaron Tomlin * We want to free module_init, but be aware that kallsyms may be 2590cfc1d277SAaron Tomlin * walking this with preempt disabled. In all the failure paths, we 2591cfc1d277SAaron Tomlin * call synchronize_rcu(), but we don't want to slow down the success 2592cfc1d277SAaron Tomlin * path. module_memfree() cannot be called in an interrupt, so do the 2593cfc1d277SAaron Tomlin * work and call synchronize_rcu() in a work queue. 2594cfc1d277SAaron Tomlin * 2595cfc1d277SAaron Tomlin * Note that module_alloc() on most architectures creates W+X page 2596cfc1d277SAaron Tomlin * mappings which won't be cleaned up until do_free_init() runs. Any 2597cfc1d277SAaron Tomlin * code such as mark_rodata_ro() which depends on those mappings to 2598*8c61e3beSChangbin Du * be cleaned up needs to sync with the queued work by invoking 2599*8c61e3beSChangbin Du * flush_module_init_free_work(). 2600cfc1d277SAaron Tomlin */ 2601cfc1d277SAaron Tomlin if (llist_add(&freeinit->node, &init_free_list)) 2602cfc1d277SAaron Tomlin schedule_work(&init_free_wq); 2603cfc1d277SAaron Tomlin 2604cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 2605cfc1d277SAaron Tomlin wake_up_all(&module_wq); 2606cfc1d277SAaron Tomlin 2607df3e764dSLuis Chamberlain mod_stat_add_long(text_size, &total_text_size); 2608df3e764dSLuis Chamberlain mod_stat_add_long(total_size, &total_mod_size); 2609df3e764dSLuis Chamberlain 2610df3e764dSLuis Chamberlain mod_stat_inc(&modcount); 2611df3e764dSLuis Chamberlain 2612cfc1d277SAaron Tomlin return 0; 2613cfc1d277SAaron Tomlin 2614cfc1d277SAaron Tomlin fail_free_freeinit: 2615cfc1d277SAaron Tomlin kfree(freeinit); 2616cfc1d277SAaron Tomlin fail: 2617cfc1d277SAaron Tomlin /* Try to protect us from buggy refcounters. */ 2618cfc1d277SAaron Tomlin mod->state = MODULE_STATE_GOING; 2619cfc1d277SAaron Tomlin synchronize_rcu(); 2620cfc1d277SAaron Tomlin module_put(mod); 2621cfc1d277SAaron Tomlin blocking_notifier_call_chain(&module_notify_list, 2622cfc1d277SAaron Tomlin MODULE_STATE_GOING, mod); 2623cfc1d277SAaron Tomlin klp_module_going(mod); 2624cfc1d277SAaron Tomlin ftrace_release_mod(mod); 2625cfc1d277SAaron Tomlin free_module(mod); 2626cfc1d277SAaron Tomlin wake_up_all(&module_wq); 2627df3e764dSLuis Chamberlain 2628cfc1d277SAaron Tomlin return ret; 2629cfc1d277SAaron Tomlin } 2630cfc1d277SAaron Tomlin 2631cfc1d277SAaron Tomlin static int may_init_module(void) 2632cfc1d277SAaron Tomlin { 2633cfc1d277SAaron Tomlin if (!capable(CAP_SYS_MODULE) || modules_disabled) 2634cfc1d277SAaron Tomlin return -EPERM; 2635cfc1d277SAaron Tomlin 2636cfc1d277SAaron Tomlin return 0; 2637cfc1d277SAaron Tomlin } 2638cfc1d277SAaron Tomlin 2639f71afa6aSLuis Chamberlain /* Is this module of this name done loading? No locks held. */ 2640f71afa6aSLuis Chamberlain static bool finished_loading(const char *name) 2641cfc1d277SAaron Tomlin { 2642f71afa6aSLuis Chamberlain struct module *mod; 2643f71afa6aSLuis Chamberlain bool ret; 2644cfc1d277SAaron Tomlin 2645f71afa6aSLuis Chamberlain /* 2646f71afa6aSLuis Chamberlain * The module_mutex should not be a heavily contended lock; 2647f71afa6aSLuis Chamberlain * if we get the occasional sleep here, we'll go an extra iteration 2648f71afa6aSLuis Chamberlain * in the wait_event_interruptible(), which is harmless. 2649f71afa6aSLuis Chamberlain */ 2650f71afa6aSLuis Chamberlain sched_annotate_sleep(); 2651cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 2652f71afa6aSLuis Chamberlain mod = find_module_all(name, strlen(name), true); 2653f71afa6aSLuis Chamberlain ret = !mod || mod->state == MODULE_STATE_LIVE 2654f71afa6aSLuis Chamberlain || mod->state == MODULE_STATE_GOING; 2655f71afa6aSLuis Chamberlain mutex_unlock(&module_mutex); 2656f71afa6aSLuis Chamberlain 2657f71afa6aSLuis Chamberlain return ret; 2658f71afa6aSLuis Chamberlain } 2659f71afa6aSLuis Chamberlain 2660f71afa6aSLuis Chamberlain /* Must be called with module_mutex held */ 2661df3e764dSLuis Chamberlain static int module_patient_check_exists(const char *name, 2662df3e764dSLuis Chamberlain enum fail_dup_mod_reason reason) 2663f71afa6aSLuis Chamberlain { 2664f71afa6aSLuis Chamberlain struct module *old; 2665f71afa6aSLuis Chamberlain int err = 0; 2666f71afa6aSLuis Chamberlain 2667f71afa6aSLuis Chamberlain old = find_module_all(name, strlen(name), true); 2668f71afa6aSLuis Chamberlain if (old == NULL) 2669f71afa6aSLuis Chamberlain return 0; 2670f71afa6aSLuis Chamberlain 2671f71afa6aSLuis Chamberlain if (old->state == MODULE_STATE_COMING || 2672f71afa6aSLuis Chamberlain old->state == MODULE_STATE_UNFORMED) { 2673cfc1d277SAaron Tomlin /* Wait in case it fails to load. */ 2674cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 2675cfc1d277SAaron Tomlin err = wait_event_interruptible(module_wq, 2676f71afa6aSLuis Chamberlain finished_loading(name)); 2677f71afa6aSLuis Chamberlain mutex_lock(&module_mutex); 2678cfc1d277SAaron Tomlin if (err) 2679f71afa6aSLuis Chamberlain return err; 26800254127aSPetr Pavlu 26810254127aSPetr Pavlu /* The module might have gone in the meantime. */ 2682f71afa6aSLuis Chamberlain old = find_module_all(name, strlen(name), true); 2683cfc1d277SAaron Tomlin } 26840254127aSPetr Pavlu 2685df3e764dSLuis Chamberlain if (try_add_failed_module(name, reason)) 2686df3e764dSLuis Chamberlain pr_warn("Could not add fail-tracking for module: %s\n", name); 2687df3e764dSLuis Chamberlain 26880254127aSPetr Pavlu /* 26890254127aSPetr Pavlu * We are here only when the same module was being loaded. Do 26900254127aSPetr Pavlu * not try to load it again right now. It prevents long delays 26910254127aSPetr Pavlu * caused by serialized module load failures. It might happen 26920254127aSPetr Pavlu * when more devices of the same type trigger load of 26930254127aSPetr Pavlu * a particular module. 26940254127aSPetr Pavlu */ 26950254127aSPetr Pavlu if (old && old->state == MODULE_STATE_LIVE) 2696f71afa6aSLuis Chamberlain return -EEXIST; 2697f71afa6aSLuis Chamberlain return -EBUSY; 2698cfc1d277SAaron Tomlin } 2699f71afa6aSLuis Chamberlain 2700f71afa6aSLuis Chamberlain /* 2701f71afa6aSLuis Chamberlain * We try to place it in the list now to make sure it's unique before 2702f71afa6aSLuis Chamberlain * we dedicate too many resources. In particular, temporary percpu 2703f71afa6aSLuis Chamberlain * memory exhaustion. 2704f71afa6aSLuis Chamberlain */ 2705f71afa6aSLuis Chamberlain static int add_unformed_module(struct module *mod) 2706f71afa6aSLuis Chamberlain { 2707f71afa6aSLuis Chamberlain int err; 2708f71afa6aSLuis Chamberlain 2709f71afa6aSLuis Chamberlain mod->state = MODULE_STATE_UNFORMED; 2710f71afa6aSLuis Chamberlain 2711f71afa6aSLuis Chamberlain mutex_lock(&module_mutex); 2712df3e764dSLuis Chamberlain err = module_patient_check_exists(mod->name, FAIL_DUP_MOD_LOAD); 2713f71afa6aSLuis Chamberlain if (err) 2714f71afa6aSLuis Chamberlain goto out; 2715f71afa6aSLuis Chamberlain 2716cfc1d277SAaron Tomlin mod_update_bounds(mod); 2717cfc1d277SAaron Tomlin list_add_rcu(&mod->list, &modules); 2718cfc1d277SAaron Tomlin mod_tree_insert(mod); 2719cfc1d277SAaron Tomlin err = 0; 2720cfc1d277SAaron Tomlin 2721cfc1d277SAaron Tomlin out: 2722cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 2723cfc1d277SAaron Tomlin return err; 2724cfc1d277SAaron Tomlin } 2725cfc1d277SAaron Tomlin 2726cfc1d277SAaron Tomlin static int complete_formation(struct module *mod, struct load_info *info) 2727cfc1d277SAaron Tomlin { 2728cfc1d277SAaron Tomlin int err; 2729cfc1d277SAaron Tomlin 2730cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 2731cfc1d277SAaron Tomlin 2732cfc1d277SAaron Tomlin /* Find duplicate symbols (must be called under lock). */ 2733cfc1d277SAaron Tomlin err = verify_exported_symbols(mod); 2734cfc1d277SAaron Tomlin if (err < 0) 2735cfc1d277SAaron Tomlin goto out; 2736cfc1d277SAaron Tomlin 273789245600SSami Tolvanen /* These rely on module_mutex for list integrity. */ 2738cfc1d277SAaron Tomlin module_bug_finalize(info->hdr, info->sechdrs, mod); 273989245600SSami Tolvanen module_cfi_finalize(info->hdr, info->sechdrs, mod); 2740cfc1d277SAaron Tomlin 2741cfc1d277SAaron Tomlin module_enable_ro(mod, false); 2742cfc1d277SAaron Tomlin module_enable_nx(mod); 2743cfc1d277SAaron Tomlin module_enable_x(mod); 2744cfc1d277SAaron Tomlin 2745cfc1d277SAaron Tomlin /* 2746cfc1d277SAaron Tomlin * Mark state as coming so strong_try_module_get() ignores us, 2747cfc1d277SAaron Tomlin * but kallsyms etc. can see us. 2748cfc1d277SAaron Tomlin */ 2749cfc1d277SAaron Tomlin mod->state = MODULE_STATE_COMING; 2750cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 2751cfc1d277SAaron Tomlin 2752cfc1d277SAaron Tomlin return 0; 2753cfc1d277SAaron Tomlin 2754cfc1d277SAaron Tomlin out: 2755cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 2756cfc1d277SAaron Tomlin return err; 2757cfc1d277SAaron Tomlin } 2758cfc1d277SAaron Tomlin 2759cfc1d277SAaron Tomlin static int prepare_coming_module(struct module *mod) 2760cfc1d277SAaron Tomlin { 2761cfc1d277SAaron Tomlin int err; 2762cfc1d277SAaron Tomlin 2763cfc1d277SAaron Tomlin ftrace_module_enable(mod); 2764cfc1d277SAaron Tomlin err = klp_module_coming(mod); 2765cfc1d277SAaron Tomlin if (err) 2766cfc1d277SAaron Tomlin return err; 2767cfc1d277SAaron Tomlin 2768cfc1d277SAaron Tomlin err = blocking_notifier_call_chain_robust(&module_notify_list, 2769cfc1d277SAaron Tomlin MODULE_STATE_COMING, MODULE_STATE_GOING, mod); 2770cfc1d277SAaron Tomlin err = notifier_to_errno(err); 2771cfc1d277SAaron Tomlin if (err) 2772cfc1d277SAaron Tomlin klp_module_going(mod); 2773cfc1d277SAaron Tomlin 2774cfc1d277SAaron Tomlin return err; 2775cfc1d277SAaron Tomlin } 2776cfc1d277SAaron Tomlin 2777cfc1d277SAaron Tomlin static int unknown_module_param_cb(char *param, char *val, const char *modname, 2778cfc1d277SAaron Tomlin void *arg) 2779cfc1d277SAaron Tomlin { 2780cfc1d277SAaron Tomlin struct module *mod = arg; 2781cfc1d277SAaron Tomlin int ret; 2782cfc1d277SAaron Tomlin 2783cfc1d277SAaron Tomlin if (strcmp(param, "async_probe") == 0) { 2784fbed4feaSChristophe JAILLET if (kstrtobool(val, &mod->async_probe_requested)) 2785cfc1d277SAaron Tomlin mod->async_probe_requested = true; 2786cfc1d277SAaron Tomlin return 0; 2787cfc1d277SAaron Tomlin } 2788cfc1d277SAaron Tomlin 2789cfc1d277SAaron Tomlin /* Check for magic 'dyndbg' arg */ 2790cfc1d277SAaron Tomlin ret = ddebug_dyndbg_module_param_cb(param, val, modname); 2791cfc1d277SAaron Tomlin if (ret != 0) 2792cfc1d277SAaron Tomlin pr_warn("%s: unknown parameter '%s' ignored\n", modname, param); 2793cfc1d277SAaron Tomlin return 0; 2794cfc1d277SAaron Tomlin } 2795cfc1d277SAaron Tomlin 279685e6f61cSLuis Chamberlain /* Module within temporary copy, this doesn't do any allocation */ 279785e6f61cSLuis Chamberlain static int early_mod_check(struct load_info *info, int flags) 279885e6f61cSLuis Chamberlain { 279985e6f61cSLuis Chamberlain int err; 280085e6f61cSLuis Chamberlain 280185e6f61cSLuis Chamberlain /* 280285e6f61cSLuis Chamberlain * Now that we know we have the correct module name, check 280385e6f61cSLuis Chamberlain * if it's blacklisted. 280485e6f61cSLuis Chamberlain */ 280585e6f61cSLuis Chamberlain if (blacklisted(info->name)) { 280685e6f61cSLuis Chamberlain pr_err("Module %s is blacklisted\n", info->name); 280785e6f61cSLuis Chamberlain return -EPERM; 280885e6f61cSLuis Chamberlain } 280985e6f61cSLuis Chamberlain 281085e6f61cSLuis Chamberlain err = rewrite_section_headers(info, flags); 281185e6f61cSLuis Chamberlain if (err) 281285e6f61cSLuis Chamberlain return err; 281385e6f61cSLuis Chamberlain 281485e6f61cSLuis Chamberlain /* Check module struct version now, before we try to use module. */ 281585e6f61cSLuis Chamberlain if (!check_modstruct_version(info, info->mod)) 281685e6f61cSLuis Chamberlain return -ENOEXEC; 281785e6f61cSLuis Chamberlain 281802da2cbaSLuis Chamberlain err = check_modinfo(info->mod, info, flags); 281902da2cbaSLuis Chamberlain if (err) 282002da2cbaSLuis Chamberlain return err; 282102da2cbaSLuis Chamberlain 2822064f4536SLuis Chamberlain mutex_lock(&module_mutex); 2823064f4536SLuis Chamberlain err = module_patient_check_exists(info->mod->name, FAIL_DUP_MOD_BECOMING); 2824064f4536SLuis Chamberlain mutex_unlock(&module_mutex); 2825064f4536SLuis Chamberlain 2826064f4536SLuis Chamberlain return err; 282785e6f61cSLuis Chamberlain } 282885e6f61cSLuis Chamberlain 2829cfc1d277SAaron Tomlin /* 2830cfc1d277SAaron Tomlin * Allocate and load the module: note that size of section 0 is always 2831cfc1d277SAaron Tomlin * zero, and we rely on this for optional sections. 2832cfc1d277SAaron Tomlin */ 2833cfc1d277SAaron Tomlin static int load_module(struct load_info *info, const char __user *uargs, 2834cfc1d277SAaron Tomlin int flags) 2835cfc1d277SAaron Tomlin { 2836cfc1d277SAaron Tomlin struct module *mod; 2837df3e764dSLuis Chamberlain bool module_allocated = false; 2838cfc1d277SAaron Tomlin long err = 0; 2839cfc1d277SAaron Tomlin char *after_dashes; 2840cfc1d277SAaron Tomlin 2841cfc1d277SAaron Tomlin /* 2842cfc1d277SAaron Tomlin * Do the signature check (if any) first. All that 2843cfc1d277SAaron Tomlin * the signature check needs is info->len, it does 2844cfc1d277SAaron Tomlin * not need any of the section info. That can be 2845cfc1d277SAaron Tomlin * set up later. This will minimize the chances 2846cfc1d277SAaron Tomlin * of a corrupt module causing problems before 2847cfc1d277SAaron Tomlin * we even get to the signature check. 2848cfc1d277SAaron Tomlin * 2849cfc1d277SAaron Tomlin * The check will also adjust info->len by stripping 2850cfc1d277SAaron Tomlin * off the sig length at the end of the module, making 2851cfc1d277SAaron Tomlin * checks against info->len more correct. 2852cfc1d277SAaron Tomlin */ 2853cfc1d277SAaron Tomlin err = module_sig_check(info, flags); 2854cfc1d277SAaron Tomlin if (err) 2855cfc1d277SAaron Tomlin goto free_copy; 2856cfc1d277SAaron Tomlin 2857cfc1d277SAaron Tomlin /* 2858cfc1d277SAaron Tomlin * Do basic sanity checks against the ELF header and 28593d40bb90SLuis Chamberlain * sections. Cache useful sections and set the 28603d40bb90SLuis Chamberlain * info->mod to the userspace passed struct module. 2861cfc1d277SAaron Tomlin */ 28623d40bb90SLuis Chamberlain err = elf_validity_cache_copy(info, flags); 2863cfc1d277SAaron Tomlin if (err) 2864cfc1d277SAaron Tomlin goto free_copy; 2865cfc1d277SAaron Tomlin 286685e6f61cSLuis Chamberlain err = early_mod_check(info, flags); 2867cfc1d277SAaron Tomlin if (err) 2868cfc1d277SAaron Tomlin goto free_copy; 2869cfc1d277SAaron Tomlin 2870cfc1d277SAaron Tomlin /* Figure out module layout, and allocate all the memory. */ 2871cfc1d277SAaron Tomlin mod = layout_and_allocate(info, flags); 2872cfc1d277SAaron Tomlin if (IS_ERR(mod)) { 2873cfc1d277SAaron Tomlin err = PTR_ERR(mod); 2874cfc1d277SAaron Tomlin goto free_copy; 2875cfc1d277SAaron Tomlin } 2876cfc1d277SAaron Tomlin 2877df3e764dSLuis Chamberlain module_allocated = true; 2878df3e764dSLuis Chamberlain 2879cfc1d277SAaron Tomlin audit_log_kern_module(mod->name); 2880cfc1d277SAaron Tomlin 2881cfc1d277SAaron Tomlin /* Reserve our place in the list. */ 2882cfc1d277SAaron Tomlin err = add_unformed_module(mod); 2883cfc1d277SAaron Tomlin if (err) 2884cfc1d277SAaron Tomlin goto free_module; 2885cfc1d277SAaron Tomlin 2886a12b9451SLuis Chamberlain /* 2887a12b9451SLuis Chamberlain * We are tainting your kernel if your module gets into 2888a12b9451SLuis Chamberlain * the modules linked list somehow. 2889a12b9451SLuis Chamberlain */ 2890a12b9451SLuis Chamberlain module_augment_kernel_taints(mod, info); 2891cfc1d277SAaron Tomlin 2892cfc1d277SAaron Tomlin /* To avoid stressing percpu allocator, do this once we're unique. */ 2893cfc1d277SAaron Tomlin err = percpu_modalloc(mod, info); 2894cfc1d277SAaron Tomlin if (err) 2895cfc1d277SAaron Tomlin goto unlink_mod; 2896cfc1d277SAaron Tomlin 2897cfc1d277SAaron Tomlin /* Now module is in final location, initialize linked lists, etc. */ 2898cfc1d277SAaron Tomlin err = module_unload_init(mod); 2899cfc1d277SAaron Tomlin if (err) 2900cfc1d277SAaron Tomlin goto unlink_mod; 2901cfc1d277SAaron Tomlin 2902cfc1d277SAaron Tomlin init_param_lock(mod); 2903cfc1d277SAaron Tomlin 2904cfc1d277SAaron Tomlin /* 2905cfc1d277SAaron Tomlin * Now we've got everything in the final locations, we can 2906cfc1d277SAaron Tomlin * find optional sections. 2907cfc1d277SAaron Tomlin */ 2908cfc1d277SAaron Tomlin err = find_module_sections(mod, info); 2909cfc1d277SAaron Tomlin if (err) 2910cfc1d277SAaron Tomlin goto free_unload; 2911cfc1d277SAaron Tomlin 2912419e1a20SLuis Chamberlain err = check_export_symbol_versions(mod); 2913cfc1d277SAaron Tomlin if (err) 2914cfc1d277SAaron Tomlin goto free_unload; 2915cfc1d277SAaron Tomlin 2916cfc1d277SAaron Tomlin /* Set up MODINFO_ATTR fields */ 2917cfc1d277SAaron Tomlin setup_modinfo(mod, info); 2918cfc1d277SAaron Tomlin 2919cfc1d277SAaron Tomlin /* Fix up syms, so that st_value is a pointer to location. */ 2920cfc1d277SAaron Tomlin err = simplify_symbols(mod, info); 2921cfc1d277SAaron Tomlin if (err < 0) 2922cfc1d277SAaron Tomlin goto free_modinfo; 2923cfc1d277SAaron Tomlin 2924cfc1d277SAaron Tomlin err = apply_relocations(mod, info); 2925cfc1d277SAaron Tomlin if (err < 0) 2926cfc1d277SAaron Tomlin goto free_modinfo; 2927cfc1d277SAaron Tomlin 2928cfc1d277SAaron Tomlin err = post_relocation(mod, info); 2929cfc1d277SAaron Tomlin if (err < 0) 2930cfc1d277SAaron Tomlin goto free_modinfo; 2931cfc1d277SAaron Tomlin 2932cfc1d277SAaron Tomlin flush_module_icache(mod); 2933cfc1d277SAaron Tomlin 2934cfc1d277SAaron Tomlin /* Now copy in args */ 2935cfc1d277SAaron Tomlin mod->args = strndup_user(uargs, ~0UL >> 1); 2936cfc1d277SAaron Tomlin if (IS_ERR(mod->args)) { 2937cfc1d277SAaron Tomlin err = PTR_ERR(mod->args); 2938cfc1d277SAaron Tomlin goto free_arch_cleanup; 2939cfc1d277SAaron Tomlin } 2940cfc1d277SAaron Tomlin 2941cfc1d277SAaron Tomlin init_build_id(mod, info); 2942cfc1d277SAaron Tomlin 2943cfc1d277SAaron Tomlin /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ 2944cfc1d277SAaron Tomlin ftrace_module_init(mod); 2945cfc1d277SAaron Tomlin 2946cfc1d277SAaron Tomlin /* Finally it's fully formed, ready to start executing. */ 2947cfc1d277SAaron Tomlin err = complete_formation(mod, info); 2948cfc1d277SAaron Tomlin if (err) 2949cfc1d277SAaron Tomlin goto ddebug_cleanup; 2950cfc1d277SAaron Tomlin 2951cfc1d277SAaron Tomlin err = prepare_coming_module(mod); 2952cfc1d277SAaron Tomlin if (err) 2953cfc1d277SAaron Tomlin goto bug_cleanup; 2954cfc1d277SAaron Tomlin 2955ae39e9edSSaravana Kannan mod->async_probe_requested = async_probe; 2956ae39e9edSSaravana Kannan 2957cfc1d277SAaron Tomlin /* Module is ready to execute: parsing args may do that. */ 2958cfc1d277SAaron Tomlin after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, 2959cfc1d277SAaron Tomlin -32768, 32767, mod, 2960cfc1d277SAaron Tomlin unknown_module_param_cb); 2961cfc1d277SAaron Tomlin if (IS_ERR(after_dashes)) { 2962cfc1d277SAaron Tomlin err = PTR_ERR(after_dashes); 2963cfc1d277SAaron Tomlin goto coming_cleanup; 2964cfc1d277SAaron Tomlin } else if (after_dashes) { 2965cfc1d277SAaron Tomlin pr_warn("%s: parameters '%s' after `--' ignored\n", 2966cfc1d277SAaron Tomlin mod->name, after_dashes); 2967cfc1d277SAaron Tomlin } 2968cfc1d277SAaron Tomlin 2969cfc1d277SAaron Tomlin /* Link in to sysfs. */ 2970cfc1d277SAaron Tomlin err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp); 2971cfc1d277SAaron Tomlin if (err < 0) 2972cfc1d277SAaron Tomlin goto coming_cleanup; 2973cfc1d277SAaron Tomlin 2974cfc1d277SAaron Tomlin if (is_livepatch_module(mod)) { 2975cfc1d277SAaron Tomlin err = copy_module_elf(mod, info); 2976cfc1d277SAaron Tomlin if (err < 0) 2977cfc1d277SAaron Tomlin goto sysfs_cleanup; 2978cfc1d277SAaron Tomlin } 2979cfc1d277SAaron Tomlin 2980cfc1d277SAaron Tomlin /* Get rid of temporary copy. */ 2981cfc1d277SAaron Tomlin free_copy(info, flags); 2982cfc1d277SAaron Tomlin 2983cfc1d277SAaron Tomlin /* Done! */ 2984cfc1d277SAaron Tomlin trace_module_load(mod); 2985cfc1d277SAaron Tomlin 2986cfc1d277SAaron Tomlin return do_init_module(mod); 2987cfc1d277SAaron Tomlin 2988cfc1d277SAaron Tomlin sysfs_cleanup: 2989cfc1d277SAaron Tomlin mod_sysfs_teardown(mod); 2990cfc1d277SAaron Tomlin coming_cleanup: 2991cfc1d277SAaron Tomlin mod->state = MODULE_STATE_GOING; 2992cfc1d277SAaron Tomlin destroy_params(mod->kp, mod->num_kp); 2993cfc1d277SAaron Tomlin blocking_notifier_call_chain(&module_notify_list, 2994cfc1d277SAaron Tomlin MODULE_STATE_GOING, mod); 2995cfc1d277SAaron Tomlin klp_module_going(mod); 2996cfc1d277SAaron Tomlin bug_cleanup: 2997cfc1d277SAaron Tomlin mod->state = MODULE_STATE_GOING; 2998cfc1d277SAaron Tomlin /* module_bug_cleanup needs module_mutex protection */ 2999cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 3000cfc1d277SAaron Tomlin module_bug_cleanup(mod); 3001cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 3002cfc1d277SAaron Tomlin 3003cfc1d277SAaron Tomlin ddebug_cleanup: 3004cfc1d277SAaron Tomlin ftrace_release_mod(mod); 3005cfc1d277SAaron Tomlin synchronize_rcu(); 3006cfc1d277SAaron Tomlin kfree(mod->args); 3007cfc1d277SAaron Tomlin free_arch_cleanup: 3008cfc1d277SAaron Tomlin module_arch_cleanup(mod); 3009cfc1d277SAaron Tomlin free_modinfo: 3010cfc1d277SAaron Tomlin free_modinfo(mod); 3011cfc1d277SAaron Tomlin free_unload: 3012cfc1d277SAaron Tomlin module_unload_free(mod); 3013cfc1d277SAaron Tomlin unlink_mod: 3014cfc1d277SAaron Tomlin mutex_lock(&module_mutex); 3015cfc1d277SAaron Tomlin /* Unlink carefully: kallsyms could be walking list. */ 3016cfc1d277SAaron Tomlin list_del_rcu(&mod->list); 3017cfc1d277SAaron Tomlin mod_tree_remove(mod); 3018cfc1d277SAaron Tomlin wake_up_all(&module_wq); 3019cfc1d277SAaron Tomlin /* Wait for RCU-sched synchronizing before releasing mod->list. */ 3020cfc1d277SAaron Tomlin synchronize_rcu(); 3021cfc1d277SAaron Tomlin mutex_unlock(&module_mutex); 3022cfc1d277SAaron Tomlin free_module: 3023df3e764dSLuis Chamberlain mod_stat_bump_invalid(info, flags); 3024cfc1d277SAaron Tomlin /* Free lock-classes; relies on the preceding sync_rcu() */ 3025ac3b4328SSong Liu for_class_mod_mem_type(type, core_data) { 3026ac3b4328SSong Liu lockdep_free_key_range(mod->mem[type].base, 3027ac3b4328SSong Liu mod->mem[type].size); 3028ac3b4328SSong Liu } 3029cfc1d277SAaron Tomlin 3030cfc1d277SAaron Tomlin module_deallocate(mod, info); 3031cfc1d277SAaron Tomlin free_copy: 3032df3e764dSLuis Chamberlain /* 3033df3e764dSLuis Chamberlain * The info->len is always set. We distinguish between 3034df3e764dSLuis Chamberlain * failures once the proper module was allocated and 3035df3e764dSLuis Chamberlain * before that. 3036df3e764dSLuis Chamberlain */ 3037df3e764dSLuis Chamberlain if (!module_allocated) 3038df3e764dSLuis Chamberlain mod_stat_bump_becoming(info, flags); 3039cfc1d277SAaron Tomlin free_copy(info, flags); 3040cfc1d277SAaron Tomlin return err; 3041cfc1d277SAaron Tomlin } 3042cfc1d277SAaron Tomlin 3043cfc1d277SAaron Tomlin SYSCALL_DEFINE3(init_module, void __user *, umod, 3044cfc1d277SAaron Tomlin unsigned long, len, const char __user *, uargs) 3045cfc1d277SAaron Tomlin { 3046cfc1d277SAaron Tomlin int err; 3047cfc1d277SAaron Tomlin struct load_info info = { }; 3048cfc1d277SAaron Tomlin 3049cfc1d277SAaron Tomlin err = may_init_module(); 3050cfc1d277SAaron Tomlin if (err) 3051cfc1d277SAaron Tomlin return err; 3052cfc1d277SAaron Tomlin 3053cfc1d277SAaron Tomlin pr_debug("init_module: umod=%p, len=%lu, uargs=%p\n", 3054cfc1d277SAaron Tomlin umod, len, uargs); 3055cfc1d277SAaron Tomlin 3056cfc1d277SAaron Tomlin err = copy_module_from_user(umod, len, &info); 3057df3e764dSLuis Chamberlain if (err) { 3058df3e764dSLuis Chamberlain mod_stat_inc(&failed_kreads); 3059df3e764dSLuis Chamberlain mod_stat_add_long(len, &invalid_kread_bytes); 3060cfc1d277SAaron Tomlin return err; 3061df3e764dSLuis Chamberlain } 3062cfc1d277SAaron Tomlin 3063cfc1d277SAaron Tomlin return load_module(&info, uargs, 0); 3064cfc1d277SAaron Tomlin } 3065cfc1d277SAaron Tomlin 30669b9879fcSLinus Torvalds struct idempotent { 30679b9879fcSLinus Torvalds const void *cookie; 30689b9879fcSLinus Torvalds struct hlist_node entry; 30699b9879fcSLinus Torvalds struct completion complete; 30709b9879fcSLinus Torvalds int ret; 30719b9879fcSLinus Torvalds }; 30729b9879fcSLinus Torvalds 30739b9879fcSLinus Torvalds #define IDEM_HASH_BITS 8 30749b9879fcSLinus Torvalds static struct hlist_head idem_hash[1 << IDEM_HASH_BITS]; 30759b9879fcSLinus Torvalds static DEFINE_SPINLOCK(idem_lock); 30769b9879fcSLinus Torvalds 30779b9879fcSLinus Torvalds static bool idempotent(struct idempotent *u, const void *cookie) 30789b9879fcSLinus Torvalds { 30799b9879fcSLinus Torvalds int hash = hash_ptr(cookie, IDEM_HASH_BITS); 30809b9879fcSLinus Torvalds struct hlist_head *head = idem_hash + hash; 30819b9879fcSLinus Torvalds struct idempotent *existing; 30829b9879fcSLinus Torvalds bool first; 30839b9879fcSLinus Torvalds 30849b9879fcSLinus Torvalds u->ret = 0; 30859b9879fcSLinus Torvalds u->cookie = cookie; 30869b9879fcSLinus Torvalds init_completion(&u->complete); 30879b9879fcSLinus Torvalds 30889b9879fcSLinus Torvalds spin_lock(&idem_lock); 30899b9879fcSLinus Torvalds first = true; 30909b9879fcSLinus Torvalds hlist_for_each_entry(existing, head, entry) { 30919b9879fcSLinus Torvalds if (existing->cookie != cookie) 30929b9879fcSLinus Torvalds continue; 30939b9879fcSLinus Torvalds first = false; 30949b9879fcSLinus Torvalds break; 30959b9879fcSLinus Torvalds } 30969b9879fcSLinus Torvalds hlist_add_head(&u->entry, idem_hash + hash); 30979b9879fcSLinus Torvalds spin_unlock(&idem_lock); 30989b9879fcSLinus Torvalds 30999b9879fcSLinus Torvalds return !first; 31009b9879fcSLinus Torvalds } 31019b9879fcSLinus Torvalds 31029b9879fcSLinus Torvalds /* 31039b9879fcSLinus Torvalds * We were the first one with 'cookie' on the list, and we ended 31049b9879fcSLinus Torvalds * up completing the operation. We now need to walk the list, 31059b9879fcSLinus Torvalds * remove everybody - which includes ourselves - fill in the return 31069b9879fcSLinus Torvalds * value, and then complete the operation. 31079b9879fcSLinus Torvalds */ 3108f1962207SLinus Torvalds static int idempotent_complete(struct idempotent *u, int ret) 31099b9879fcSLinus Torvalds { 31109b9879fcSLinus Torvalds const void *cookie = u->cookie; 31119b9879fcSLinus Torvalds int hash = hash_ptr(cookie, IDEM_HASH_BITS); 31129b9879fcSLinus Torvalds struct hlist_head *head = idem_hash + hash; 31139b9879fcSLinus Torvalds struct hlist_node *next; 31149b9879fcSLinus Torvalds struct idempotent *pos; 31159b9879fcSLinus Torvalds 31169b9879fcSLinus Torvalds spin_lock(&idem_lock); 31179b9879fcSLinus Torvalds hlist_for_each_entry_safe(pos, next, head, entry) { 31189b9879fcSLinus Torvalds if (pos->cookie != cookie) 31199b9879fcSLinus Torvalds continue; 31209b9879fcSLinus Torvalds hlist_del(&pos->entry); 31219b9879fcSLinus Torvalds pos->ret = ret; 31229b9879fcSLinus Torvalds complete(&pos->complete); 31239b9879fcSLinus Torvalds } 31249b9879fcSLinus Torvalds spin_unlock(&idem_lock); 3125f1962207SLinus Torvalds return ret; 31269b9879fcSLinus Torvalds } 31279b9879fcSLinus Torvalds 3128054a7300SLinus Torvalds static int init_module_from_file(struct file *f, const char __user * uargs, int flags) 3129cfc1d277SAaron Tomlin { 3130cfc1d277SAaron Tomlin struct load_info info = { }; 3131cfc1d277SAaron Tomlin void *buf = NULL; 3132f1962207SLinus Torvalds int len; 31339b9879fcSLinus Torvalds 3134054a7300SLinus Torvalds len = kernel_read_file(f, 0, &buf, INT_MAX, NULL, READING_MODULE); 3135df3e764dSLuis Chamberlain if (len < 0) { 3136df3e764dSLuis Chamberlain mod_stat_inc(&failed_kreads); 3137cfc1d277SAaron Tomlin return len; 3138df3e764dSLuis Chamberlain } 3139cfc1d277SAaron Tomlin 3140cfc1d277SAaron Tomlin if (flags & MODULE_INIT_COMPRESSED_FILE) { 3141054a7300SLinus Torvalds int err = module_decompress(&info, buf, len); 3142cfc1d277SAaron Tomlin vfree(buf); /* compressed data is no longer needed */ 3143df3e764dSLuis Chamberlain if (err) { 3144df3e764dSLuis Chamberlain mod_stat_inc(&failed_decompress); 3145df3e764dSLuis Chamberlain mod_stat_add_long(len, &invalid_decompress_bytes); 3146cfc1d277SAaron Tomlin return err; 3147df3e764dSLuis Chamberlain } 3148cfc1d277SAaron Tomlin } else { 3149cfc1d277SAaron Tomlin info.hdr = buf; 3150cfc1d277SAaron Tomlin info.len = len; 3151cfc1d277SAaron Tomlin } 3152cfc1d277SAaron Tomlin 3153f1962207SLinus Torvalds return load_module(&info, uargs, flags); 3154f1962207SLinus Torvalds } 3155f1962207SLinus Torvalds 3156f1962207SLinus Torvalds static int idempotent_init_module(struct file *f, const char __user * uargs, int flags) 3157f1962207SLinus Torvalds { 3158f1962207SLinus Torvalds struct idempotent idem; 3159f1962207SLinus Torvalds 3160f1962207SLinus Torvalds if (!f || !(f->f_mode & FMODE_READ)) 3161f1962207SLinus Torvalds return -EBADF; 3162f1962207SLinus Torvalds 3163f1962207SLinus Torvalds /* See if somebody else is doing the operation? */ 3164f1962207SLinus Torvalds if (idempotent(&idem, file_inode(f))) { 3165f1962207SLinus Torvalds wait_for_completion(&idem.complete); 3166f1962207SLinus Torvalds return idem.ret; 3167f1962207SLinus Torvalds } 3168f1962207SLinus Torvalds 3169f1962207SLinus Torvalds /* Otherwise, we'll do it and complete others */ 3170f1962207SLinus Torvalds return idempotent_complete(&idem, 3171f1962207SLinus Torvalds init_module_from_file(f, uargs, flags)); 3172cfc1d277SAaron Tomlin } 3173cfc1d277SAaron Tomlin 3174054a7300SLinus Torvalds SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags) 3175054a7300SLinus Torvalds { 3176054a7300SLinus Torvalds int err; 3177054a7300SLinus Torvalds struct fd f; 3178054a7300SLinus Torvalds 3179054a7300SLinus Torvalds err = may_init_module(); 3180054a7300SLinus Torvalds if (err) 3181054a7300SLinus Torvalds return err; 3182054a7300SLinus Torvalds 3183054a7300SLinus Torvalds pr_debug("finit_module: fd=%d, uargs=%p, flags=%i\n", fd, uargs, flags); 3184054a7300SLinus Torvalds 3185054a7300SLinus Torvalds if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS 3186054a7300SLinus Torvalds |MODULE_INIT_IGNORE_VERMAGIC 3187054a7300SLinus Torvalds |MODULE_INIT_COMPRESSED_FILE)) 3188054a7300SLinus Torvalds return -EINVAL; 3189054a7300SLinus Torvalds 3190054a7300SLinus Torvalds f = fdget(fd); 3191f1962207SLinus Torvalds err = idempotent_init_module(f.file, uargs, flags); 3192054a7300SLinus Torvalds fdput(f); 3193054a7300SLinus Torvalds return err; 3194054a7300SLinus Torvalds } 3195054a7300SLinus Torvalds 3196cfc1d277SAaron Tomlin /* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */ 319717dd25c2SAaron Tomlin char *module_flags(struct module *mod, char *buf, bool show_state) 3198cfc1d277SAaron Tomlin { 3199cfc1d277SAaron Tomlin int bx = 0; 3200cfc1d277SAaron Tomlin 3201cfc1d277SAaron Tomlin BUG_ON(mod->state == MODULE_STATE_UNFORMED); 320217dd25c2SAaron Tomlin if (!mod->taints && !show_state) 320317dd25c2SAaron Tomlin goto out; 3204cfc1d277SAaron Tomlin if (mod->taints || 3205cfc1d277SAaron Tomlin mod->state == MODULE_STATE_GOING || 3206cfc1d277SAaron Tomlin mod->state == MODULE_STATE_COMING) { 3207cfc1d277SAaron Tomlin buf[bx++] = '('; 3208c14e522bSAaron Tomlin bx += module_flags_taint(mod->taints, buf + bx); 3209cfc1d277SAaron Tomlin /* Show a - for module-is-being-unloaded */ 321017dd25c2SAaron Tomlin if (mod->state == MODULE_STATE_GOING && show_state) 3211cfc1d277SAaron Tomlin buf[bx++] = '-'; 3212cfc1d277SAaron Tomlin /* Show a + for module-is-being-loaded */ 321317dd25c2SAaron Tomlin if (mod->state == MODULE_STATE_COMING && show_state) 3214cfc1d277SAaron Tomlin buf[bx++] = '+'; 3215cfc1d277SAaron Tomlin buf[bx++] = ')'; 3216cfc1d277SAaron Tomlin } 321717dd25c2SAaron Tomlin out: 3218cfc1d277SAaron Tomlin buf[bx] = '\0'; 3219cfc1d277SAaron Tomlin 3220cfc1d277SAaron Tomlin return buf; 3221cfc1d277SAaron Tomlin } 3222cfc1d277SAaron Tomlin 3223cfc1d277SAaron Tomlin /* Given an address, look for it in the module exception tables. */ 3224cfc1d277SAaron Tomlin const struct exception_table_entry *search_module_extables(unsigned long addr) 3225cfc1d277SAaron Tomlin { 3226cfc1d277SAaron Tomlin const struct exception_table_entry *e = NULL; 3227cfc1d277SAaron Tomlin struct module *mod; 3228cfc1d277SAaron Tomlin 3229cfc1d277SAaron Tomlin preempt_disable(); 3230cfc1d277SAaron Tomlin mod = __module_address(addr); 3231cfc1d277SAaron Tomlin if (!mod) 3232cfc1d277SAaron Tomlin goto out; 3233cfc1d277SAaron Tomlin 3234cfc1d277SAaron Tomlin if (!mod->num_exentries) 3235cfc1d277SAaron Tomlin goto out; 3236cfc1d277SAaron Tomlin 3237cfc1d277SAaron Tomlin e = search_extable(mod->extable, 3238cfc1d277SAaron Tomlin mod->num_exentries, 3239cfc1d277SAaron Tomlin addr); 3240cfc1d277SAaron Tomlin out: 3241cfc1d277SAaron Tomlin preempt_enable(); 3242cfc1d277SAaron Tomlin 3243cfc1d277SAaron Tomlin /* 3244cfc1d277SAaron Tomlin * Now, if we found one, we are running inside it now, hence 3245cfc1d277SAaron Tomlin * we cannot unload the module, hence no refcnt needed. 3246cfc1d277SAaron Tomlin */ 3247cfc1d277SAaron Tomlin return e; 3248cfc1d277SAaron Tomlin } 3249cfc1d277SAaron Tomlin 3250cfc1d277SAaron Tomlin /** 3251cfc1d277SAaron Tomlin * is_module_address() - is this address inside a module? 3252cfc1d277SAaron Tomlin * @addr: the address to check. 3253cfc1d277SAaron Tomlin * 3254cfc1d277SAaron Tomlin * See is_module_text_address() if you simply want to see if the address 3255cfc1d277SAaron Tomlin * is code (not data). 3256cfc1d277SAaron Tomlin */ 3257cfc1d277SAaron Tomlin bool is_module_address(unsigned long addr) 3258cfc1d277SAaron Tomlin { 3259cfc1d277SAaron Tomlin bool ret; 3260cfc1d277SAaron Tomlin 3261cfc1d277SAaron Tomlin preempt_disable(); 3262cfc1d277SAaron Tomlin ret = __module_address(addr) != NULL; 3263cfc1d277SAaron Tomlin preempt_enable(); 3264cfc1d277SAaron Tomlin 3265cfc1d277SAaron Tomlin return ret; 3266cfc1d277SAaron Tomlin } 3267cfc1d277SAaron Tomlin 3268cfc1d277SAaron Tomlin /** 3269cfc1d277SAaron Tomlin * __module_address() - get the module which contains an address. 3270cfc1d277SAaron Tomlin * @addr: the address. 3271cfc1d277SAaron Tomlin * 3272cfc1d277SAaron Tomlin * Must be called with preempt disabled or module mutex held so that 3273cfc1d277SAaron Tomlin * module doesn't get freed during this. 3274cfc1d277SAaron Tomlin */ 3275cfc1d277SAaron Tomlin struct module *__module_address(unsigned long addr) 3276cfc1d277SAaron Tomlin { 3277cfc1d277SAaron Tomlin struct module *mod; 3278cfc1d277SAaron Tomlin 327901dc0386SChristophe Leroy if (addr >= mod_tree.addr_min && addr <= mod_tree.addr_max) 3280ac3b4328SSong Liu goto lookup; 3281ac3b4328SSong Liu 328201dc0386SChristophe Leroy #ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC 3283ac3b4328SSong Liu if (addr >= mod_tree.data_addr_min && addr <= mod_tree.data_addr_max) 3284ac3b4328SSong Liu goto lookup; 328501dc0386SChristophe Leroy #endif 3286ac3b4328SSong Liu 3287cfc1d277SAaron Tomlin return NULL; 3288cfc1d277SAaron Tomlin 3289ac3b4328SSong Liu lookup: 3290cfc1d277SAaron Tomlin module_assert_mutex_or_preempt(); 3291cfc1d277SAaron Tomlin 3292ac3b4328SSong Liu mod = mod_find(addr, &mod_tree); 3293cfc1d277SAaron Tomlin if (mod) { 3294cfc1d277SAaron Tomlin BUG_ON(!within_module(addr, mod)); 3295cfc1d277SAaron Tomlin if (mod->state == MODULE_STATE_UNFORMED) 3296cfc1d277SAaron Tomlin mod = NULL; 3297cfc1d277SAaron Tomlin } 3298cfc1d277SAaron Tomlin return mod; 3299cfc1d277SAaron Tomlin } 3300cfc1d277SAaron Tomlin 3301cfc1d277SAaron Tomlin /** 3302cfc1d277SAaron Tomlin * is_module_text_address() - is this address inside module code? 3303cfc1d277SAaron Tomlin * @addr: the address to check. 3304cfc1d277SAaron Tomlin * 3305cfc1d277SAaron Tomlin * See is_module_address() if you simply want to see if the address is 3306cfc1d277SAaron Tomlin * anywhere in a module. See kernel_text_address() for testing if an 3307cfc1d277SAaron Tomlin * address corresponds to kernel or module code. 3308cfc1d277SAaron Tomlin */ 3309cfc1d277SAaron Tomlin bool is_module_text_address(unsigned long addr) 3310cfc1d277SAaron Tomlin { 3311cfc1d277SAaron Tomlin bool ret; 3312cfc1d277SAaron Tomlin 3313cfc1d277SAaron Tomlin preempt_disable(); 3314cfc1d277SAaron Tomlin ret = __module_text_address(addr) != NULL; 3315cfc1d277SAaron Tomlin preempt_enable(); 3316cfc1d277SAaron Tomlin 3317cfc1d277SAaron Tomlin return ret; 3318cfc1d277SAaron Tomlin } 3319cfc1d277SAaron Tomlin 3320cfc1d277SAaron Tomlin /** 3321cfc1d277SAaron Tomlin * __module_text_address() - get the module whose code contains an address. 3322cfc1d277SAaron Tomlin * @addr: the address. 3323cfc1d277SAaron Tomlin * 3324cfc1d277SAaron Tomlin * Must be called with preempt disabled or module mutex held so that 3325cfc1d277SAaron Tomlin * module doesn't get freed during this. 3326cfc1d277SAaron Tomlin */ 3327cfc1d277SAaron Tomlin struct module *__module_text_address(unsigned long addr) 3328cfc1d277SAaron Tomlin { 3329cfc1d277SAaron Tomlin struct module *mod = __module_address(addr); 3330cfc1d277SAaron Tomlin if (mod) { 3331cfc1d277SAaron Tomlin /* Make sure it's within the text section. */ 3332ac3b4328SSong Liu if (!within_module_mem_type(addr, mod, MOD_TEXT) && 3333ac3b4328SSong Liu !within_module_mem_type(addr, mod, MOD_INIT_TEXT)) 3334cfc1d277SAaron Tomlin mod = NULL; 3335cfc1d277SAaron Tomlin } 3336cfc1d277SAaron Tomlin return mod; 3337cfc1d277SAaron Tomlin } 3338cfc1d277SAaron Tomlin 3339cfc1d277SAaron Tomlin /* Don't grab lock, we're oopsing. */ 3340cfc1d277SAaron Tomlin void print_modules(void) 3341cfc1d277SAaron Tomlin { 3342cfc1d277SAaron Tomlin struct module *mod; 3343cfc1d277SAaron Tomlin char buf[MODULE_FLAGS_BUF_SIZE]; 3344cfc1d277SAaron Tomlin 3345cfc1d277SAaron Tomlin printk(KERN_DEFAULT "Modules linked in:"); 3346cfc1d277SAaron Tomlin /* Most callers should already have preempt disabled, but make sure */ 3347cfc1d277SAaron Tomlin preempt_disable(); 3348cfc1d277SAaron Tomlin list_for_each_entry_rcu(mod, &modules, list) { 3349cfc1d277SAaron Tomlin if (mod->state == MODULE_STATE_UNFORMED) 3350cfc1d277SAaron Tomlin continue; 335117dd25c2SAaron Tomlin pr_cont(" %s%s", mod->name, module_flags(mod, buf, true)); 3352cfc1d277SAaron Tomlin } 335399bd9956SAaron Tomlin 335499bd9956SAaron Tomlin print_unloaded_tainted_modules(); 3355cfc1d277SAaron Tomlin preempt_enable(); 33566f1dae1dSAaron Tomlin if (last_unloaded_module.name[0]) 33576f1dae1dSAaron Tomlin pr_cont(" [last unloaded: %s%s]", last_unloaded_module.name, 33586f1dae1dSAaron Tomlin last_unloaded_module.taints); 3359cfc1d277SAaron Tomlin pr_cont("\n"); 3360cfc1d277SAaron Tomlin } 3361df3e764dSLuis Chamberlain 3362df3e764dSLuis Chamberlain #ifdef CONFIG_MODULE_DEBUGFS 3363df3e764dSLuis Chamberlain struct dentry *mod_debugfs_root; 3364df3e764dSLuis Chamberlain 3365df3e764dSLuis Chamberlain static int module_debugfs_init(void) 3366df3e764dSLuis Chamberlain { 3367df3e764dSLuis Chamberlain mod_debugfs_root = debugfs_create_dir("modules", NULL); 3368df3e764dSLuis Chamberlain return 0; 3369df3e764dSLuis Chamberlain } 3370df3e764dSLuis Chamberlain module_init(module_debugfs_init); 3371df3e764dSLuis Chamberlain #endif 3372