bootconfig: Print array as multiple commands for legacy command line

Print arraied values as multiple same options for legacy
kernel command line. With this rule, if the "kernel.*" and
"init.*" array entries in bootconfig are printed out as
multiple same options, e.g.

kernel {
 console = "ttyS0,115200"
 console += "tty0"
}

will be correctly converted to

console="ttyS0,115200" console="tty0"

in the kernel command line.

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

Reported-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Masami Hiramatsu 2020-02-20 21:19:42 +09:00 committed by Steven Rostedt (VMware)
parent a24d286f36
commit 88b913718d

View File

@ -268,7 +268,6 @@ static int __init xbc_snprint_cmdline(char *buf, size_t size,
{ {
struct xbc_node *knode, *vnode; struct xbc_node *knode, *vnode;
char *end = buf + size; char *end = buf + size;
char c = '\"';
const char *val; const char *val;
int ret; int ret;
@ -279,25 +278,20 @@ static int __init xbc_snprint_cmdline(char *buf, size_t size,
return ret; return ret;
vnode = xbc_node_get_child(knode); vnode = xbc_node_get_child(knode);
ret = snprintf(buf, rest(buf, end), "%s%c", xbc_namebuf, if (!vnode) {
vnode ? '=' : ' '); ret = snprintf(buf, rest(buf, end), "%s ", xbc_namebuf);
if (ret < 0) if (ret < 0)
return ret; return ret;
buf += ret; buf += ret;
if (!vnode) continue;
continue; }
xbc_array_for_each_value(vnode, val) {
c = '\"'; ret = snprintf(buf, rest(buf, end), "%s=\"%s\" ",
xbc_array_for_each_value(vnode, val) { xbc_namebuf, val);
ret = snprintf(buf, rest(buf, end), "%c%s", c, val);
if (ret < 0) if (ret < 0)
return ret; return ret;
buf += ret; buf += ret;
c = ',';
} }
if (rest(buf, end) > 2)
strcpy(buf, "\" ");
buf += 2;
} }
return buf - (end - size); return buf - (end - size);