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

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@devnote2Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 15e95037
...@@ -62,6 +62,13 @@ Or more shorter, written as following:: ...@@ -62,6 +62,13 @@ Or more shorter, written as following::
In both styles, same key words are automatically merged when parsing it In both styles, same key words are automatically merged when parsing it
at boot time. So you can append similar trees or key-values. 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 Comments
-------- --------
......
...@@ -533,7 +533,7 @@ struct xbc_node *find_match_node(struct xbc_node *node, char *k) ...@@ -533,7 +533,7 @@ struct xbc_node *find_match_node(struct xbc_node *node, char *k)
static int __init __xbc_add_key(char *k) static int __init __xbc_add_key(char *k)
{ {
struct xbc_node *node; struct xbc_node *node, *child;
if (!xbc_valid_keyword(k)) if (!xbc_valid_keyword(k))
return xbc_parse_error("Invalid keyword", k); return xbc_parse_error("Invalid keyword", k);
...@@ -543,8 +543,12 @@ static int __init __xbc_add_key(char *k) ...@@ -543,8 +543,12 @@ static int __init __xbc_add_key(char *k)
if (!last_parent) /* the first level */ if (!last_parent) /* the first level */
node = find_match_node(xbc_nodes, k); node = find_match_node(xbc_nodes, k);
else else {
node = find_match_node(xbc_node_get_child(last_parent), k); 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) if (node)
last_parent = node; last_parent = node;
...@@ -577,7 +581,7 @@ static int __init __xbc_parse_keys(char *k) ...@@ -577,7 +581,7 @@ static int __init __xbc_parse_keys(char *k)
static int __init xbc_parse_kv(char **k, char *v) static int __init xbc_parse_kv(char **k, char *v)
{ {
struct xbc_node *prev_parent = last_parent; struct xbc_node *prev_parent = last_parent;
struct xbc_node *node; struct xbc_node *node, *child;
char *next; char *next;
int c, ret; int c, ret;
...@@ -585,6 +589,10 @@ static int __init xbc_parse_kv(char **k, char *v) ...@@ -585,6 +589,10 @@ static int __init xbc_parse_kv(char **k, char *v)
if (ret) if (ret)
return 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); c = __xbc_parse_value(&v, &next);
if (c < 0) if (c < 0)
return c; return c;
......
# value -> subkey pattern
key = value
key.subkey = another-value
# subkey -> value pattern
key.subkey = value
key = another-value
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment