[PATCH] kconfig: initialize sym->curr.tri to no for all symbol types again

From: Masahiro Yamada
Date: Fri Jan 26 2024 - 08:30:23 EST


In C programming, a non-zero value is interpreted as true, and a zero
value as false.

Kconfig has never worked like that; only 'bool' and 'tristate' symbols
are properly handled in conditionals. The other types ('int', 'hex',
'string') are always interpreted as false if used in boolean contexts.

Until commit 4e244c10eab3 ("kconfig: remove unneeded symbol_empty
variable") accidentally changed the behavior, the default of
CONFIG_LOG_CPU_MAX_BUF_SHIFT was unconditionally 12, because the 'int'
symbol 'BASE_SMALL' was evaluated as false, hence 'if !BASE_SMALL' was
always true.

You can confirm it as follows:

$ git checkout 4e244c10eab3^

$ make -s ARCH=x86_64 defconfig
$ grep -e LOG_CPU_MAX_BUF_SHIFT -e BASE_SMALL -e BASE_FULL .config
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_BASE_FULL=y
CONFIG_BASE_SMALL=0

$ make -s ARCH=arm keystone_defconfig
$ grep -e LOG_CPU_MAX_BUF_SHIFT -e BASE_SMALL -e BASE_FULL .config
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
# CONFIG_BASE_FULL is not set
CONFIG_BASE_SMALL=1

CONFIG_LOG_CPU_MAX_BUF_SHIFT defaults to 12 irrespective of the value
of CONFIG_BASE_SMALL.

Since commit 4e244c10eab3, this is an undefined behavior because
sym_calc_value() stopped setting the sym->curr.tri field for 'int',
'hex', and 'string' symbols.

Commit 23b2899f7f19 ("printk: allow increasing the ring buffer depending
on the number of CPUs") presumably intended the following:

config LOG_CPU_MAX_BUF_SHIFT
int "CPU kernel log buffer size contribution (13 => 8 KB, 17 => 128KB)"
[snip]
default 12 if BASE_SMALL == 0
default 0

But, the correct fixes would potentially impact multiple defconfigs,
hence they should be reviewed in each dedicated subsystem.

Restore the original behavior for now.

Fixes: 4e244c10eab3 ("kconfig: remove unneeded symbol_empty variable")
Reported-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
Closes: https://lore.kernel.org/all/CAMuHMdWm6u1wX7efZQf=2XUAHascps76YQac6rdnQGhc8nop_Q@xxxxxxxxxxxxxx/
Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx>
---

scripts/kconfig/symbol.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index f615e2c1e85d..1290c6d2f8c2 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -346,6 +346,8 @@ void sym_calc_value(struct symbol *sym)

oldval = sym->curr;

+ newval.tri = no;
+
switch (sym->type) {
case S_INT:
newval.val = "0";
@@ -358,7 +360,7 @@ void sym_calc_value(struct symbol *sym)
break;
case S_BOOLEAN:
case S_TRISTATE:
- newval = symbol_no.curr;
+ newval.val = "n";
break;
default:
sym->curr.val = sym->name;
--
2.40.1