Skip to content

Commit

Permalink
bootconfig: Prohibit re-defining value on same key
Browse files Browse the repository at this point in the history
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) <[email protected]>
Signed-off-by: Masami Hiramatsu <[email protected]>
[ Fixed spelling of arraies to arrays ]
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
  • Loading branch information
mhiramat authored and rostedt committed Feb 21, 2020
1 parent 88b9137 commit 4e4694d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
11 changes: 10 additions & 1 deletion Documentation/admin-guide/bootconfig.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 8 additions & 5 deletions lib/bootconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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 */
Expand Down
6 changes: 6 additions & 0 deletions tools/bootconfig/samples/bad-samekey.bconf
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Same key value is not allowed
key {
foo = value
bar = value2
}
key.foo = value

0 comments on commit 4e4694d

Please sign in to comment.