Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b211104d authored by Rusty Russell's avatar Rusty Russell
Browse files

module: Enhance verify_export_symbols



Make verify_export_symbols check the modules unused, unused_gpl and
gpl_future syms.

Inspired by Jan Beulich's fix, but table-driven.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 4e2d9245
Loading
Loading
Loading
Loading
+24 −24
Original line number Diff line number Diff line
@@ -1400,33 +1400,33 @@ EXPORT_SYMBOL_GPL(__symbol_get);
 */
static int verify_export_symbols(struct module *mod)
{
	const char *name = NULL;
	unsigned long i, ret = 0;
	unsigned int i;
	struct module *owner;
	const unsigned long *crc;
	const struct kernel_symbol *s;
	struct {
		const struct kernel_symbol *sym;
		unsigned int num;
	} arr[] = {
		{ mod->syms, mod->num_syms },
		{ mod->gpl_syms, mod->num_gpl_syms },
		{ mod->gpl_future_syms, mod->num_gpl_future_syms },
		{ mod->unused_syms, mod->num_unused_syms },
		{ mod->unused_gpl_syms, mod->num_unused_gpl_syms },
	};

	for (i = 0; i < mod->num_syms; i++)
		if (!IS_ERR_VALUE(find_symbol(mod->syms[i].name,
					      &owner, &crc, true, false))) {
			name = mod->syms[i].name;
			ret = -ENOEXEC;
			goto dup;
	for (i = 0; i < ARRAY_SIZE(arr); i++) {
		for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
			if (!IS_ERR_VALUE(find_symbol(s->name, &owner,
						      NULL, true, false))) {
				printk(KERN_ERR
				       "%s: exports duplicate symbol %s"
				       " (owned by %s)\n",
				       mod->name, s->name, module_name(owner));
				return -ENOEXEC;
			}

	for (i = 0; i < mod->num_gpl_syms; i++)
		if (!IS_ERR_VALUE(find_symbol(mod->gpl_syms[i].name,
					      &owner, &crc, true, false))) {
			name = mod->gpl_syms[i].name;
			ret = -ENOEXEC;
			goto dup;
		}

dup:
	if (ret)
		printk(KERN_ERR "%s: exports duplicate symbol %s (owned by %s)\n",
			mod->name, name, module_name(owner));

	return ret;
	}
	return 0;
}

/* Change all symbols so that st_value encodes the pointer directly. */