4590 lines · 117.2 KB · C
RawDownload
 	pr_warn("%s: loading module not compiled with retpoline compiler.\n",		mod->name);} /* Sets info->hdr and info->len. */static int copy_module_from_user(const void __user *umod, unsigned long len,				  struct load_info *info){	int err; 	info->len = len;	if (info->len < sizeof(*(info->hdr)))		return -ENOEXEC; 	err = security_kernel_load_data(LOADING_MODULE);	if (err)		return err; 	/* Suck in entire file: we'll want most of it. */	info->hdr = __vmalloc(info->len, GFP_KERNEL | __GFP_NOWARN);	if (!info->hdr)		return -ENOMEM; 	if (copy_chunked_from_user(info->hdr, umod, info->len) != 0) {		vfree(info->hdr);		return -EFAULT;	} 	return 0;} static void free_copy(struct load_info *info){	vfree(info->hdr);} static int rewrite_section_headers(struct load_info *info, int flags){	unsigned int i; 	/* This should always be true, but let's be sure. */	info->sechdrs[0].sh_addr = 0; 	for (i = 1; i < info->hdr->e_shnum; i++) {		Elf_Shdr *shdr = &info->sechdrs[i];		if (shdr->sh_type != SHT_NOBITS		    && info->len < shdr->sh_offset + shdr->sh_size) {			pr_err("Module len %lu truncated\n", info->len);			return -ENOEXEC;		} 		/* Mark all sections sh_addr with their address in the		   temporary image. */		shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset; #ifndef CONFIG_MODULE_UNLOAD		/* Don't load .exit sections */		if (module_exit_section(info->secstrings+shdr->sh_name))			shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;#endif	} 	/* Track but don't keep modinfo and version sections. */	info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;	info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC; 	return 0;} /* * Set up our basic convenience variables (pointers to section headers, * search for module section index etc), and do some basic section * verification. * * Set info->mod to the temporary copy of the module in info->hdr. The final one * will be allocated in move_module(). */static int setup_load_info(struct load_info *info, int flags){	unsigned int i; 	/* Set up the convenience variables */	info->sechdrs = (void *)info->hdr + info->hdr->e_shoff;	info->secstrings = (void *)info->hdr		+ info->sechdrs[info->hdr->e_shstrndx].sh_offset; 	/* Try to find a name early so we can log errors with a module name */	info->index.info = find_sec(info, ".modinfo");	if (info->index.info)		info->name = get_modinfo(info, "name"); 	/* Find internal symbols and strings. */	for (i = 1; i < info->hdr->e_shnum; i++) {		if (info->sechdrs[i].sh_type == SHT_SYMTAB) {			info->index.sym = i;			info->index.str = info->sechdrs[i].sh_link;			info->strtab = (char *)info->hdr				+ info->sechdrs[info->index.str].sh_offset;			break;		}	} 	if (info->index.sym == 0) {		pr_warn("%s: module has no symbols (stripped?)\n",			info->name ?: "(missing .modinfo section or name field)");		return -ENOEXEC;	} 	info->index.mod = find_sec(info, ".gnu.linkonce.this_module");	if (!info->index.mod) {		pr_warn("%s: No module found in object\n",			info->name ?: "(missing .modinfo section or name field)");		return -ENOEXEC;	}	/* This is temporary: point mod into copy of data. */	info->mod = (void *)info->hdr + info->sechdrs[info->index.mod].sh_offset; 	/*	 * If we didn't load the .modinfo 'name' field earlier, fall back to	 * on-disk struct mod 'name' field.	 */	if (!info->name)		info->name = info->mod->name; 	if (flags & MODULE_INIT_IGNORE_MODVERSIONS)		info->index.vers = 0; /* Pretend no __versions section! */	else		info->index.vers = find_sec(info, "__versions"); 	info->index.pcpu = find_pcpusec(info); 	return 0;} static int check_modinfo(struct module *mod, struct load_info *info, int flags){	const char *modmagic = get_modinfo(info, "vermagic");	int err; 	if (flags & MODULE_INIT_IGNORE_VERMAGIC)		modmagic = NULL; 	/* This is allowed: modprobe --force will invalidate it. */	if (!modmagic) {		err = try_to_force_load(mod, "bad vermagic");		if (err)			return err;	} else if (!same_magic(modmagic, vermagic, info->index.vers)) {		pr_err("%s: version magic '%s' should be '%s'\n",		       info->name, modmagic, vermagic);		return -ENOEXEC;	} 	if (!get_modinfo(info, "intree")) {		if (!test_taint(TAINT_OOT_MODULE))			pr_warn("%s: loading out-of-tree module taints kernel.\n",				mod->name);		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);	} 	check_modinfo_retpoline(mod, info); 	if (get_modinfo(info, "staging")) {		add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);		pr_warn("%s: module is from the staging directory, the quality "			"is unknown, you have been warned.\n", mod->name);	} 	err = check_modinfo_livepatch(mod, info);	if (err)		return err; 	/* Set up license info based on the info section */	set_license(mod, get_modinfo(info, "license")); 	return 0;} static int find_module_sections(struct module *mod, struct load_info *info){	mod->kp = section_objs(info, "__param",			       sizeof(*mod->kp), &mod->num_kp);	mod->syms = section_objs(info, "__ksymtab",				 sizeof(*mod->syms), &mod->num_syms);	mod->crcs = section_addr(info, "__kcrctab");	mod->gpl_syms = section_objs(info, "__ksymtab_gpl",				     sizeof(*mod->gpl_syms),				     &mod->num_gpl_syms);	mod->gpl_crcs = section_addr(info, "__kcrctab_gpl");	mod->gpl_future_syms = section_objs(info,					    "__ksymtab_gpl_future",					    sizeof(*mod->gpl_future_syms),					    &mod->num_gpl_future_syms);	mod->gpl_future_crcs = section_addr(info, "__kcrctab_gpl_future"); #ifdef CONFIG_UNUSED_SYMBOLS	mod->unused_syms = section_objs(info, "__ksymtab_unused",					sizeof(*mod->unused_syms),					&mod->num_unused_syms);	mod->unused_crcs = section_addr(info, "__kcrctab_unused");	mod->unused_gpl_syms = section_objs(info, "__ksymtab_unused_gpl",					    sizeof(*mod->unused_gpl_syms),					    &mod->num_unused_gpl_syms);	mod->unused_gpl_crcs = section_addr(info, "__kcrctab_unused_gpl");#endif#ifdef CONFIG_CONSTRUCTORS	mod->ctors = section_objs(info, ".ctors",				  sizeof(*mod->ctors), &mod->num_ctors);	if (!mod->ctors)		mod->ctors = section_objs(info, ".init_array",				sizeof(*mod->ctors), &mod->num_ctors);	else if (find_sec(info, ".init_array")) {		/*		 * This shouldn't happen with same compiler and binutils		 * building all parts of the module.		 */		pr_warn("%s: has both .ctors and .init_array.\n",		       mod->name);		return -EINVAL;	}#endif 	mod->noinstr_text_start = section_objs(info, ".noinstr.text", 1,						&mod->noinstr_text_size); #ifdef CONFIG_TRACEPOINTS	mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",					     sizeof(*mod->tracepoints_ptrs),					     &mod->num_tracepoints);#endif#ifdef CONFIG_TREE_SRCU	mod->srcu_struct_ptrs = section_objs(info, "___srcu_struct_ptrs",					     sizeof(*mod->srcu_struct_ptrs),					     &mod->num_srcu_structs);#endif#ifdef CONFIG_BPF_EVENTS	mod->bpf_raw_events = section_objs(info, "__bpf_raw_tp_map",					   sizeof(*mod->bpf_raw_events),					   &mod->num_bpf_raw_events);#endif#ifdef CONFIG_JUMP_LABEL	mod->jump_entries = section_objs(info, "__jump_table",					sizeof(*mod->jump_entries),					&mod->num_jump_entries);#endif#ifdef CONFIG_EVENT_TRACING	mod->trace_events = section_objs(info, "_ftrace_events",					 sizeof(*mod->trace_events),					 &mod->num_trace_events);	mod->trace_evals = section_objs(info, "_ftrace_eval_map",					sizeof(*mod->trace_evals),					&mod->num_trace_evals);#endif#ifdef CONFIG_TRACING	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",					 sizeof(*mod->trace_bprintk_fmt_start),					 &mod->num_trace_bprintk_fmt);#endif#ifdef CONFIG_FTRACE_MCOUNT_RECORD	/* sechdrs[0].sh_size is always zero */	mod->ftrace_callsites = section_objs(info, FTRACE_CALLSITE_SECTION,					     sizeof(*mod->ftrace_callsites),					     &mod->num_ftrace_callsites);#endif#ifdef CONFIG_FUNCTION_ERROR_INJECTION	mod->ei_funcs = section_objs(info, "_error_injection_whitelist",					    sizeof(*mod->ei_funcs),					    &mod->num_ei_funcs);#endif#ifdef CONFIG_KPROBES	mod->kprobes_text_start = section_objs(info, ".kprobes.text", 1,						&mod->kprobes_text_size);	mod->kprobe_blacklist = section_objs(info, "_kprobe_blacklist",						sizeof(unsigned long),						&mod->num_kprobe_blacklist);#endif	mod->extable = section_objs(info, "__ex_table",				    sizeof(*mod->extable), &mod->num_exentries); 	if (section_addr(info, "__obsparm"))		pr_warn("%s: Ignoring obsolete parameters\n", mod->name); 	info->debug = section_objs(info, "__dyndbg",				   sizeof(*info->debug), &info->num_debug); 	return 0;} static int move_module(struct module *mod, struct load_info *info){	int i;	void *ptr; 	/* Do the allocs. */	ptr = module_alloc(mod->core_layout.size);	/*	 * The pointer to this block is stored in the module structure	 * which is inside the block. Just mark it as not being a	 * leak.	 */	kmemleak_not_leak(ptr);	if (!ptr)		return -ENOMEM; 	memset(ptr, 0, mod->core_layout.size);	mod->core_layout.base = ptr; 	if (mod->init_layout.size) {		ptr = module_alloc(mod->init_layout.size);		/*		 * The pointer to this block is stored in the module structure		 * which is inside the block. This block doesn't need to be		 * scanned as it contains data and code that will be freed		 * after the module is initialized.		 */		kmemleak_ignore(ptr);		if (!ptr) {			module_memfree(mod->core_layout.base);			return -ENOMEM;		}		memset(ptr, 0, mod->init_layout.size);		mod->init_layout.base = ptr;	} else		mod->init_layout.base = NULL; 	/* Transfer each section which specifies SHF_ALLOC */	pr_debug("final section addresses:\n");	for (i = 0; i < info->hdr->e_shnum; i++) {		void *dest;		Elf_Shdr *shdr = &info->sechdrs[i]; 		if (!(shdr->sh_flags & SHF_ALLOC))			continue; 		if (shdr->sh_entsize & INIT_OFFSET_MASK)			dest = mod->init_layout.base				+ (shdr->sh_entsize & ~INIT_OFFSET_MASK);		else			dest = mod->core_layout.base + shdr->sh_entsize; 		if (shdr->sh_type != SHT_NOBITS)			memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);		/* Update sh_addr to point to copy in image. */		shdr->sh_addr = (unsigned long)dest;		pr_debug("\t0x%lx %s\n",			 (long)shdr->sh_addr, info->secstrings + shdr->sh_name);	} 	return 0;} static int check_module_license_and_versions(struct module *mod){	int prev_taint = test_taint(TAINT_PROPRIETARY_MODULE); 	/*	 * ndiswrapper is under GPL by itself, but loads proprietary modules.	 * Don't use add_taint_module(), as it would prevent ndiswrapper from	 * using GPL-only symbols it needs.	 */	if (strcmp(mod->name, "ndiswrapper") == 0)		add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE); 	/* driverloader was caught wrongly pretending to be under GPL */	if (strcmp(mod->name, "driverloader") == 0)		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,				 LOCKDEP_NOW_UNRELIABLE); 	/* lve claims to be GPL but upstream won't provide source */	if (strcmp(mod->name, "lve") == 0)		add_taint_module(mod, TAINT_PROPRIETARY_MODULE,				 LOCKDEP_NOW_UNRELIABLE); 	if (!prev_taint && test_taint(TAINT_PROPRIETARY_MODULE))		pr_warn("%s: module license taints kernel.\n", mod->name); #ifdef CONFIG_MODVERSIONS	if ((mod->num_syms && !mod->crcs)	    || (mod->num_gpl_syms && !mod->gpl_crcs)	    || (mod->num_gpl_future_syms && !mod->gpl_future_crcs)#ifdef CONFIG_UNUSED_SYMBOLS	    || (mod->num_unused_syms && !mod->unused_crcs)	    || (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs)#endif		) {		return try_to_force_load(mod,					 "no versions for exported symbols");	}#endif	return 0;} static void flush_module_icache(const struct module *mod){	/*	 * Flush the instruction cache, since we've played with text.	 * Do it before processing of module parameters, so the module	 * can provide parameter accessor functions of its own.	 */	if (mod->init_layout.base)		flush_icache_range((unsigned long)mod->init_layout.base,				   (unsigned long)mod->init_layout.base				   + mod->init_layout.size);	flush_icache_range((unsigned long)mod->core_layout.base,			   (unsigned long)mod->core_layout.base + mod->core_layout.size);} int __weak module_frob_arch_sections(Elf_Ehdr *hdr,				     Elf_Shdr *sechdrs,				     char *secstrings,				     struct module *mod){	return 0;} /* module_blacklist is a comma-separated list of module names */static char *module_blacklist;static bool blacklisted(const char *module_name){	const char *p;	size_t len; 	if (!module_blacklist)		return false; 	for (p = module_blacklist; *p; p += len) {		len = strcspn(p, ",");		if (strlen(module_name) == len && !memcmp(module_name, p, len))			return true;		if (p[len] == ',')			len++;	}	return false;}core_param(module_blacklist, module_blacklist, charp, 0400); static struct module *layout_and_allocate(struct load_info *info, int flags){	struct module *mod;	unsigned int ndx;	int err; 	err = check_modinfo(info->mod, info, flags);	if (err)		return ERR_PTR(err); 	/* Allow arches to frob section contents and sizes.  */	err = module_frob_arch_sections(info->hdr, info->sechdrs,					info->secstrings, info->mod);	if (err < 0)		return ERR_PTR(err); 	err = module_enforce_rwx_sections(info->hdr, info->sechdrs,					  info->secstrings, info->mod);	if (err < 0)		return ERR_PTR(err); 	/* We will do a special allocation for per-cpu sections later. */	info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC; 	/*	 * Mark ro_after_init section with SHF_RO_AFTER_INIT so that	 * layout_sections() can put it in the right place.	 * Note: ro_after_init sections also have SHF_{WRITE,ALLOC} set.	 */	ndx = find_sec(info, ".data..ro_after_init");	if (ndx)		info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT;	/*	 * Mark the __jump_table section as ro_after_init as well: these data	 * structures are never modified, with the exception of entries that	 * refer to code in the __init section, which are annotated as such	 * at module load time.	 */	ndx = find_sec(info, "__jump_table");	if (ndx)		info->sechdrs[ndx].sh_flags |= SHF_RO_AFTER_INIT; 	/* Determine total sizes, and put offsets in sh_entsize.  For now	   this is done generically; there doesn't appear to be any	   special cases for the architectures. */	layout_sections(info->mod, info);	layout_symtab(info->mod, info); 	/* Allocate and move to the final place */	err = move_module(info->mod, info);	if (err)		return ERR_PTR(err); 	/* Module has been copied to its final place now: return it. */	mod = (void *)info->sechdrs[info->index.mod].sh_addr;	kmemleak_load_module(mod, info);	return mod;} /* mod is no longer valid after this! */static void module_deallocate(struct module *mod, struct load_info *info){	percpu_modfree(mod);

Lines 3001–3500 of 4590. Previous lines