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: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Родитель
15e95037b4
Коммит
a24d286f36
|
@ -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
|
||||
--------
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
# value -> subkey pattern
|
||||
key = value
|
||||
key.subkey = another-value
|
|
@ -0,0 +1,3 @@
|
|||
# subkey -> value pattern
|
||||
key.subkey = value
|
||||
key = another-value
|
Загрузка…
Ссылка в новой задаче