From nobody Sat Feb 7 18:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F05A53939C6; Wed, 4 Feb 2026 08:33:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770194033; cv=none; b=S81TG7Sa+ErgMuH7enRDcr0JSujWy70PCyWNipYw3m+JpSaoj3awpqUH+tWQ+2CtAlAoi9JbQbeRgbLyQKyxNfR+43Q+DNteCO55WX7uJ3CqmxAtutJtmIi2Y6jdgvD0gBcsPRpBHiA7rSAWIxO9d76v2nHSVKd92Dv8jOOdn3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770194033; c=relaxed/simple; bh=1cOkDbKMpYsYNHXVAbpVY0vQllsEmE1khMNUWtLPUtA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fGUaTisZ2R/7FsB+Ex5brB789OqSroXthHMoVg1Lt/CzleRDRMZOnguZ7qbINVVi5xefr9cmUkXPBXViSabZ18cHUzGBBCoGWwTSyukpGLB4G/Pip4CSi0p//9NyM0lQoAsM4GHjWi6+nHOiRHZSb8vRF5Xs8fhRDWU0k94DyNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=f/ZldSk3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="f/ZldSk3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3FD3CC4CEF7; Wed, 4 Feb 2026 08:33:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770194032; bh=1cOkDbKMpYsYNHXVAbpVY0vQllsEmE1khMNUWtLPUtA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f/ZldSk3Wme+1rcbjVWQ9g7Eu5VAefM/fD/TryuiCnaTWmIEbNhdeW46RTl7Dzdrz UolqtMN6dR2/JY75Qj7ci9U2lwFGUvSTGBExGBcpGm7sYOWa4o9dfBLiiZQYxTHiiE 3im3nTvH/YDY8/hkEBw/uQ1Q2IJth8r/sqtBMlsL2EPt/Kpq4gvGXHpSxYXj3KkjGI EZAYdlRFOxP161OjFHnbLJ78OfKE2NdTA+xkLqjtqrJTHzydiP0vl0r7yCCOXh/Y6X qHMaJWMtQImphJLEGab/0xMQPYJbPcEloKCz/dJzcnS6CF4I8Oxo+sV2+yU5YDfCop Fa23aeeuPBaaQ== From: "Masami Hiramatsu (Google)" To: Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Julius Werner , Masami Hiramatsu , LKML Subject: [PATCH v2 1/2] bootconfig: Terminate value search if it hits a newline Date: Wed, 4 Feb 2026 17:33:48 +0900 Message-ID: <177019402883.80694.10977484286951965499.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <177019401833.80694.554894321526842218.stgit@devnote2> References: <177019401833.80694.554894321526842218.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Terminate the value search for a key if it hits a newline and make the value empty. When we pass a bootconfig with an empty value terminated by the newline, like below:: foo =3D bar =3D value Current bootconfig interprets it as a single entry:: foo =3D "bar =3D value"; The Documentation/admin-guide/bootconfig.rst defines the value itself is terminated by newline: The value has to be terminated by semi-colon (``;``) or newline (``\n``). but it does not define when the value search is terminated. This changes the behavior to more line-oriented, so that it can clear how it is working. - The value search of key-value pair will be terminated by a comment or newline. - The value search of an array will continue beyond comments and newlines. Thus, with this update, the above example is interpreted as:: foo =3D ""; bar =3D "value"; And the below example will cause a syntax error because "bar" is expected as a key but it has ','. foo =3D bar, buz According to this change, one wrong example config is updated. Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Julius Werner --- Changes in v2: - Fix to handle multi-line array case correctly. - Make this as a spec update, not fix. --- .../samples/good-array-space-comment.bconf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin= -guide/bootconfig.rst index 7a86042c9b6d..843b24b8de88 100644 --- a/Documentation/admin-guide/bootconfig.rst +++ b/Documentation/admin-guide/bootconfig.rst @@ -20,18 +20,26 @@ Config File Syntax =20 The boot config syntax is a simple structured key-value. Each key consists of dot-connected-words, and key and value are connected by ``=3D``. The va= lue -has to be terminated by semi-colon (``;``) or newline (``\n``). -For array value, array entries are separated by comma (``,``). :: - - KEY[.WORD[...]] =3D VALUE[, VALUE2[...]][;] - -Unlike the kernel command line syntax, spaces are OK around the comma and = ``=3D``. +string has to be terminated by the following delimiters described below. =20 Each key word must contain only alphabets, numbers, dash (``-``) or unders= core (``_``). And each value only contains printable characters or spaces except for delimiters such as semi-colon (``;``), new-line (``\n``), comma (``,``= ), hash (``#``) and closing brace (``}``). =20 +If the ``=3D`` is followed by whitespace up to one of these delimiters, the +key is assigned an empty value. + +For arrays, the array values are comma (``,``) separated, and comments and +line breaks with newline (``\n``) are allowed between array values for +readability. Thus the first entry of the array must be the same line of the +key.:: + + KEY[.WORD[...]] =3D VALUE[, VALUE2[...]][;] + +Unlike the kernel command line syntax, white spaces (including tabs) are +ignored around the comma and ``=3D``. + If you want to use those delimiters in a value, you can use either double- quotes (``"VALUE"``) or single-quotes (``'VALUE'``) to quote it. Note that you can not escape these quotes. @@ -138,8 +146,8 @@ This is parsed as below:: foo =3D value bar =3D 1, 2, 3 =20 -Note that you can not put a comment between value and delimiter(``,`` or -``;``). This means following config has a syntax error :: +Note that you can NOT put a comment or a newline between value and delimit= er +(``,`` or ``;``). This means following config has a syntax error :: =20 key =3D 1 # comment ,2 diff --git a/lib/bootconfig.c b/lib/bootconfig.c index 81f29c29f47b..c210fb8b1e85 100644 --- a/lib/bootconfig.c +++ b/lib/bootconfig.c @@ -557,17 +557,13 @@ static int __init __xbc_close_brace(char *p) /* * Return delimiter or error, no node added. As same as lib/cmdline.c, * you can use " around spaces, but can't escape " for value. + * *@__v must point real value string. (not including spaces before value.) */ static int __init __xbc_parse_value(char **__v, char **__n) { char *p, *v =3D *__v; int c, quotes =3D 0; =20 - v =3D skip_spaces(v); - while (*v =3D=3D '#') { - v =3D skip_comment(v); - v =3D skip_spaces(v); - } if (*v =3D=3D '"' || *v =3D=3D '\'') { quotes =3D *v; v++; @@ -617,6 +613,13 @@ static int __init xbc_parse_array(char **__v) last_parent =3D xbc_node_get_child(last_parent); =20 do { + /* Search the next array value beyond comments and empty lines */ + next =3D skip_spaces(*__v); + while (*next =3D=3D '#') { + next =3D skip_comment(next); + next =3D skip_spaces(next); + } + *__v =3D next; c =3D __xbc_parse_value(__v, &next); if (c < 0) return c; @@ -701,9 +704,17 @@ static int __init xbc_parse_kv(char **k, char *v, int = op) if (ret) return ret; =20 - c =3D __xbc_parse_value(&v, &next); - if (c < 0) - return c; + v =3D skip_spaces_until_newline(v); + /* If there is a comment, this has an mpty value. */ + if (*v =3D=3D '#') { + next =3D skip_comment(v); + *v =3D '\0'; + c =3D '\n'; + } else { + c =3D __xbc_parse_value(&v, &next); + if (c < 0) + return c; + } =20 child =3D xbc_node_get_child(last_parent); if (child && xbc_node_is_value(child)) { diff --git a/tools/bootconfig/samples/good-array-space-comment.bconf b/tool= s/bootconfig/samples/good-array-space-comment.bconf index 45b938dc0695..416fa2ed4109 100644 --- a/tools/bootconfig/samples/good-array-space-comment.bconf +++ b/tools/bootconfig/samples/good-array-space-comment.bconf @@ -1,4 +1,3 @@ -key =3D # comment - "value1", # comment1 +key =3D "value1", # comment1 "value2" , # comment2 "value3" From nobody Sat Feb 7 18:16:07 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C46B393DFF; Wed, 4 Feb 2026 08:34:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770194042; cv=none; b=QM5L8xugdnLwXfBrwJtOWcEbzVWKbzmZiUglEYstSnuym8Pgoew0WoI5JK6TTGat/ZUzVxqUzqJEKfp69uI0WBUO9cyd/2Sm5VG5RJpjh7ulUYHRUaiUU80E3UTN6qzoNkdMSAPGo8Gurbs+Exy5vP4qlo3dtdvuO/2K+gAON/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770194042; c=relaxed/simple; bh=4FjPmb39YbXZnU0L7xf3JpkjKWD1Gg/Q4bF7Go1GUko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WY8D8AXOmBYHVf5Sycf7yqOLBroIF7xu/Wcx8YBtoF5pwxaaLv7cUwHcy8giwZmPgQIt5J975I5ONRfdFubszhVMvWHtMHdpduED6WPSunP/dsFx3JvmY9OruuqYJOjQSiZmiYijzqFDYZTAhER5f4IxWyFpRZl2m/V3q8DQc6A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Xeq9Np+L; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Xeq9Np+L" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F14DC4CEF7; Wed, 4 Feb 2026 08:34:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770194041; bh=4FjPmb39YbXZnU0L7xf3JpkjKWD1Gg/Q4bF7Go1GUko=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Xeq9Np+LjCyhQkhOYxvnKIHB+ICyS22REoCa6KCVUQ+0GlOx5tQyA3pvFvcG433r/ RWKHvyjaHqT0QVhW4MjbzOrocqCqkyscV6N9jHQJLz4XFQtyu8U514x9JV8wHk/PA7 RLFoKqZOHXIieSXbr2532mpPqkdx6UjX4jiiGY3QQIQ+SnEYbvF07zpVtIlGt7frgm JTEVzb/1iYuVsuZqGqz7nwoBE+9MOvg/Idz4uFkzoKEUT0J0gYIFtJSRyDR7YVN7Sj JujEOZGGnW2ZF65EiEiM1bR3VxxpasLyI33j8vNJvuzJgHNL9KAKsdSF3SfqlnAm1b 8qKYVP38mOMIg== From: "Masami Hiramatsu (Google)" To: Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Julius Werner , Masami Hiramatsu , LKML Subject: [PATCH v2 2/2] bootconfig: Check the parsed output of the good examples Date: Wed, 4 Feb 2026 17:33:58 +0900 Message-ID: <177019403805.80694.10065992068449824435.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <177019401833.80694.554894321526842218.stgit@devnote2> References: <177019401833.80694.554894321526842218.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Check whether the parsed output of the good example configs are the same as expected. Signed-off-by: Masami Hiramatsu (Google) Tested-by: Steven Rostedt (Google) --- .../samples/exp-good-array-space-comment.bconf | 1 + .../samples/exp-good-comment-after-value.bconf | 1 + .../bootconfig/samples/exp-good-mixed-append.bconf | 2 ++ tools/bootconfig/samples/exp-good-mixed-kv1.bconf | 2 ++ tools/bootconfig/samples/exp-good-mixed-kv2.bconf | 2 ++ tools/bootconfig/samples/exp-good-mixed-kv3.bconf | 5 +++++ .../samples/exp-good-mixed-override.bconf | 2 ++ tools/bootconfig/samples/exp-good-override.bconf | 4 ++++ tools/bootconfig/samples/exp-good-printables.bconf | 2 ++ tools/bootconfig/samples/exp-good-simple.bconf | 8 ++++++++ tools/bootconfig/samples/exp-good-single.bconf | 3 +++ .../samples/exp-good-space-after-value.bconf | 1 + tools/bootconfig/samples/exp-good-tree.bconf | 8 ++++++++ tools/bootconfig/test-bootconfig.sh | 3 +++ 14 files changed, 44 insertions(+) create mode 100644 tools/bootconfig/samples/exp-good-array-space-comment.b= conf create mode 100644 tools/bootconfig/samples/exp-good-comment-after-value.b= conf create mode 100644 tools/bootconfig/samples/exp-good-mixed-append.bconf create mode 100644 tools/bootconfig/samples/exp-good-mixed-kv1.bconf create mode 100644 tools/bootconfig/samples/exp-good-mixed-kv2.bconf create mode 100644 tools/bootconfig/samples/exp-good-mixed-kv3.bconf create mode 100644 tools/bootconfig/samples/exp-good-mixed-override.bconf create mode 100644 tools/bootconfig/samples/exp-good-override.bconf create mode 100644 tools/bootconfig/samples/exp-good-printables.bconf create mode 100644 tools/bootconfig/samples/exp-good-simple.bconf create mode 100644 tools/bootconfig/samples/exp-good-single.bconf create mode 100644 tools/bootconfig/samples/exp-good-space-after-value.bco= nf create mode 100644 tools/bootconfig/samples/exp-good-tree.bconf diff --git a/tools/bootconfig/samples/exp-good-array-space-comment.bconf b/= tools/bootconfig/samples/exp-good-array-space-comment.bconf new file mode 100644 index 000000000000..8d3278fa6af5 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-array-space-comment.bconf @@ -0,0 +1 @@ +key =3D "value1", "value2", "value3"; diff --git a/tools/bootconfig/samples/exp-good-comment-after-value.bconf b/= tools/bootconfig/samples/exp-good-comment-after-value.bconf new file mode 100644 index 000000000000..a8e8450db3c0 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-comment-after-value.bconf @@ -0,0 +1 @@ +key =3D "value"; diff --git a/tools/bootconfig/samples/exp-good-mixed-append.bconf b/tools/b= ootconfig/samples/exp-good-mixed-append.bconf new file mode 100644 index 000000000000..c2b407901ddd --- /dev/null +++ b/tools/bootconfig/samples/exp-good-mixed-append.bconf @@ -0,0 +1,2 @@ +key =3D "foo", "bar"; +keyx.subkey =3D "value"; diff --git a/tools/bootconfig/samples/exp-good-mixed-kv1.bconf b/tools/boot= config/samples/exp-good-mixed-kv1.bconf new file mode 100644 index 000000000000..8346287d9251 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-mixed-kv1.bconf @@ -0,0 +1,2 @@ +key =3D "value"; +key.subkey =3D "another-value"; diff --git a/tools/bootconfig/samples/exp-good-mixed-kv2.bconf b/tools/boot= config/samples/exp-good-mixed-kv2.bconf new file mode 100644 index 000000000000..40c6232c7cdd --- /dev/null +++ b/tools/bootconfig/samples/exp-good-mixed-kv2.bconf @@ -0,0 +1,2 @@ +key =3D "another-value"; +key.subkey =3D "value"; diff --git a/tools/bootconfig/samples/exp-good-mixed-kv3.bconf b/tools/boot= config/samples/exp-good-mixed-kv3.bconf new file mode 100644 index 000000000000..8368a7bef60a --- /dev/null +++ b/tools/bootconfig/samples/exp-good-mixed-kv3.bconf @@ -0,0 +1,5 @@ +key =3D "value"; +key { + subkey1; + subkey2 =3D "foo"; +} diff --git a/tools/bootconfig/samples/exp-good-mixed-override.bconf b/tools= /bootconfig/samples/exp-good-mixed-override.bconf new file mode 100644 index 000000000000..58757712ca45 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-mixed-override.bconf @@ -0,0 +1,2 @@ +key =3D "value2"; +key.foo =3D "bar"; diff --git a/tools/bootconfig/samples/exp-good-override.bconf b/tools/bootc= onfig/samples/exp-good-override.bconf new file mode 100644 index 000000000000..00bbd30e99ae --- /dev/null +++ b/tools/bootconfig/samples/exp-good-override.bconf @@ -0,0 +1,4 @@ +key { + word =3D "2", "3"; + new.word =3D "new"; +} diff --git a/tools/bootconfig/samples/exp-good-printables.bconf b/tools/boo= tconfig/samples/exp-good-printables.bconf new file mode 100644 index 000000000000..5981d304eacb --- /dev/null +++ b/tools/bootconfig/samples/exp-good-printables.bconf @@ -0,0 +1,2 @@ +key =3D "=09 +=0B=0C !#$%&'()*+,-./0123456789:;<=3D>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab= cdefghijklmnopqrstuvwxyz{|}~"; diff --git a/tools/bootconfig/samples/exp-good-simple.bconf b/tools/bootcon= fig/samples/exp-good-simple.bconf new file mode 100644 index 000000000000..d17f39421c86 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-simple.bconf @@ -0,0 +1,8 @@ +key { + word1 =3D "1"; + word2 =3D "2"; + word3 =3D "3"; + word4 =3D "4"; + word5 =3D "5"; + word6 =3D "6"; +} diff --git a/tools/bootconfig/samples/exp-good-single.bconf b/tools/bootcon= fig/samples/exp-good-single.bconf new file mode 100644 index 000000000000..01196910d7f4 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-single.bconf @@ -0,0 +1,3 @@ +key =3D "1"; +key2 =3D "2"; +key3 =3D "alpha", "beta"; diff --git a/tools/bootconfig/samples/exp-good-space-after-value.bconf b/to= ols/bootconfig/samples/exp-good-space-after-value.bconf new file mode 100644 index 000000000000..a8e8450db3c0 --- /dev/null +++ b/tools/bootconfig/samples/exp-good-space-after-value.bconf @@ -0,0 +1 @@ +key =3D "value"; diff --git a/tools/bootconfig/samples/exp-good-tree.bconf b/tools/bootconfi= g/samples/exp-good-tree.bconf new file mode 100644 index 000000000000..b711d38d86fd --- /dev/null +++ b/tools/bootconfig/samples/exp-good-tree.bconf @@ -0,0 +1,8 @@ +key { + word.tree.value =3D "0"; + word2.tree.value =3D "1", "2"; +} +other.tree { + value =3D "2"; + value2 =3D "3"; +} diff --git a/tools/bootconfig/test-bootconfig.sh b/tools/bootconfig/test-bo= otconfig.sh index 7594659af1e1..be9bd18b1d56 100755 --- a/tools/bootconfig/test-bootconfig.sh +++ b/tools/bootconfig/test-bootconfig.sh @@ -179,6 +179,9 @@ done echo "=3D=3D=3D expected success cases =3D=3D=3D" for i in samples/good-* ; do xpass $BOOTCONF -a $i $INITRD + x=3D"samples/exp-"`basename $i` + $BOOTCONF $i > $TEMPCONF + xpass diff $x $TEMPCONF done