bootconfig: Prohibit re-defining value on same key

Currently, bootconfig adds a new value on the existing key to the tail of an
array. But this looks a bit confusing because an admin can easily rewrite
the original value in the same config file.

This rejects the following value re-definition.

  key = value1
  ...
  key = value2

You should rewrite value1 to value2 in this case.

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

Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
[ Fixed spelling of arraies to arrays ]
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Masami Hiramatsu 2020-02-21 17:13:42 +09:00 committed by Steven Rostedt (VMware)
parent 88b913718d
commit 4e4694d872
3 changed files with 24 additions and 6 deletions

View file

@ -62,7 +62,16 @@ 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.
Same-key Values
---------------
It is prohibited that two or more values or arrays share a same-key.
For example,::
foo = bar, baz
foo = qux # !ERROR! we can not re-define same key
Also, a sub-key and a value can not co-exist under a parent key.
For example, following config is NOT allowed.::
foo = value1

View file

@ -581,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, *child;
struct xbc_node *child;
char *next;
int c, ret;
@ -590,15 +590,18 @@ static int __init xbc_parse_kv(char **k, char *v)
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);
if (child) {
if (xbc_node_is_key(child))
return xbc_parse_error("Value is mixed with subkey", v);
else
return xbc_parse_error("Value is redefined", v);
}
c = __xbc_parse_value(&v, &next);
if (c < 0)
return c;
node = xbc_add_sibling(v, XBC_VALUE);
if (!node)
if (!xbc_add_sibling(v, XBC_VALUE))
return -ENOMEM;
if (c == ',') { /* Array */

View file

@ -0,0 +1,6 @@
# Same key value is not allowed
key {
foo = value
bar = value2
}
key.foo = value