Commit a24d286f authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Steven Rostedt (VMware)
Browse files

bootconfig: Reject subkey and value on same parent key

Reject if a value node is mixed with subkey node on same
parent key node.

A value node can not co-exist with subkey node under some key
node, e.g.

key = value
key.subkey = another-value

This is not be allowed because bootconfig API is not designed
to handle such case.

Link: http://lkml.kernel.org/r/158220115232.26565.7792340045009731803.stgit@devnote2



Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 15e95037
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -62,6 +62,13 @@ Or more shorter, written as following::
In both styles, same key words are automatically merged when parsing it
at boot time. So you can append similar trees or key-values.

Note that a sub-key and a value can not co-exist under a parent key.
For example, following config is NOT allowed.::

 foo = value1
 foo.bar = value2 # !ERROR! subkey "bar" and value "value1" can NOT co-exist


Comments
--------

+12 −4
Original line number Diff line number Diff line
@@ -533,7 +533,7 @@ struct xbc_node *find_match_node(struct xbc_node *node, char *k)

static int __init __xbc_add_key(char *k)
{
	struct xbc_node *node;
	struct xbc_node *node, *child;

	if (!xbc_valid_keyword(k))
		return xbc_parse_error("Invalid keyword", k);
@@ -543,8 +543,12 @@ static int __init __xbc_add_key(char *k)

	if (!last_parent)	/* the first level */
		node = find_match_node(xbc_nodes, k);
	else
		node = find_match_node(xbc_node_get_child(last_parent), k);
	else {
		child = xbc_node_get_child(last_parent);
		if (child && xbc_node_is_value(child))
			return xbc_parse_error("Subkey is mixed with value", k);
		node = find_match_node(child, k);
	}

	if (node)
		last_parent = node;
@@ -577,7 +581,7 @@ static int __init __xbc_parse_keys(char *k)
static int __init xbc_parse_kv(char **k, char *v)
{
	struct xbc_node *prev_parent = last_parent;
	struct xbc_node *node;
	struct xbc_node *node, *child;
	char *next;
	int c, ret;

@@ -585,6 +589,10 @@ static int __init xbc_parse_kv(char **k, char *v)
	if (ret)
		return ret;

	child = xbc_node_get_child(last_parent);
	if (child && xbc_node_is_key(child))
		return xbc_parse_error("Value is mixed with subkey", v);

	c = __xbc_parse_value(&v, &next);
	if (c < 0)
		return c;
+3 −0
Original line number Diff line number Diff line
# value -> subkey pattern
key = value
key.subkey = another-value
+3 −0
Original line number Diff line number Diff line
# subkey -> value pattern
key.subkey = value
key = another-value