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

Commit 106937e8 authored by Leif Lindholm's avatar Leif Lindholm Committed by Rob Herring
Browse files

of: fix handling of '/' in options for of_find_node_by_path()



Ensure proper handling of paths with appended options (after ':'),
where those options may contain a '/'.

Fixes: 7914a7c5 ("of: support passing console options with stdout-path")
Reported-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarLeif Lindholm <leif.lindholm@linaro.org>
Cc: <stable@vger.kernel.org> # 3.19
Signed-off-by: default avatarRob Herring <robh@kernel.org>
parent 649022e0
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -714,16 +714,17 @@ static struct device_node *__of_find_node_by_path(struct device_node *parent,
						const char *path)
{
	struct device_node *child;
	int len = strchrnul(path, '/') - path;
	int term;
	int len;
	const char *end;

	end = strchr(path, ':');
	if (!end)
		end = strchrnul(path, '/');

	len = end - path;
	if (!len)
		return NULL;

	term = strchrnul(path, ':') - path;
	if (term < len)
		len = term;

	__for_each_child_of_node(parent, child) {
		const char *name = strrchr(child->full_name, '/');
		if (WARN(!name, "malformed device_node %s\n", child->full_name))
@@ -768,8 +769,12 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt

	/* The path could begin with an alias */
	if (*path != '/') {
		char *p = strchrnul(path, '/');
		int len = separator ? separator - path : p - path;
		int len;
		const char *p = separator;

		if (!p)
			p = strchrnul(path, '/');
		len = p - path;

		/* of_aliases must not be NULL */
		if (!of_aliases)
@@ -794,6 +799,8 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
		path++; /* Increment past '/' delimiter */
		np = __of_find_node_by_path(np, path);
		path = strchrnul(path, '/');
		if (separator && separator < path)
			break;
	}
	raw_spin_unlock_irqrestore(&devtree_lock, flags);
	return np;