Commit 754f8733 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Masahiro Yamada
Browse files

module: Extend the module namespace parsing



Instead of only accepting "module:${name}", extend it with a comma
separated list of module names and add tail glob support.

That is, something like: "module:foo-*,bar" is now possible.

Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Reviewed-by: default avatarPetr Pavlu <petr.pavlu@suse.com>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 520b1a14
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -1083,12 +1083,44 @@ static char *get_modinfo(const struct load_info *info, const char *tag)
	return get_next_modinfo(info, tag, NULL);
}

/**
 * verify_module_namespace() - does @modname have access to this symbol's @namespace
 * @namespace: export symbol namespace
 * @modname: module name
 *
 * If @namespace is prefixed with "module:" to indicate it is a module namespace
 * then test if @modname matches any of the comma separated patterns.
 *
 * The patterns only support tail-glob.
 */
static bool verify_module_namespace(const char *namespace, const char *modname)
{
	size_t len, modlen = strlen(modname);
	const char *prefix = "module:";
	const char *sep;
	bool glob;

	if (!strstarts(namespace, prefix))
		return false;

	for (namespace += strlen(prefix); *namespace; namespace = sep) {
		sep = strchrnul(namespace, ',');
		len = sep - namespace;

	return strstarts(namespace, prefix) &&
	       !strcmp(namespace + strlen(prefix), modname);
		glob = false;
		if (sep[-1] == '*') {
			len--;
			glob = true;
		}

		if (*sep)
			sep++;

		if (strncmp(namespace, modname, len) == 0 && (glob || len == modlen))
			return true;
	}

	return false;
}

static int verify_namespace_is_imported(const struct load_info *info,
+34 −2
Original line number Diff line number Diff line
@@ -1682,12 +1682,44 @@ void buf_write(struct buffer *buf, const char *s, int len)
	buf->pos += len;
}

/**
 * verify_module_namespace() - does @modname have access to this symbol's @namespace
 * @namespace: export symbol namespace
 * @modname: module name
 *
 * If @namespace is prefixed with "module:" to indicate it is a module namespace
 * then test if @modname matches any of the comma separated patterns.
 *
 * The patterns only support tail-glob.
 */
static bool verify_module_namespace(const char *namespace, const char *modname)
{
	size_t len, modlen = strlen(modname);
	const char *prefix = "module:";
	const char *sep;
	bool glob;

	if (!strstarts(namespace, prefix))
		return false;

	for (namespace += strlen(prefix); *namespace; namespace = sep) {
		sep = strchrnul(namespace, ',');
		len = sep - namespace;

	return strstarts(namespace, prefix) &&
	       !strcmp(namespace + strlen(prefix), modname);
		glob = false;
		if (sep[-1] == '*') {
			len--;
			glob = true;
		}

		if (*sep)
			sep++;

		if (strncmp(namespace, modname, len) == 0 && (glob || len == modlen))
			return true;
	}

	return false;
}

static void check_exports(struct module *mod)