Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kconfig: show sub-menu entries even if the prompt is hidden

Since commit f79dc03fe68c ("kconfig: refactor choice value
calculation"), when EXPERT is disabled, nothing within the "if INPUT"
... "endif" block in drivers/input/Kconfig is displayed. This issue
affects all command-line interfaces and GUI frontends.

The prompt for INPUT is hidden when EXPERT is disabled. Previously,
menu_is_visible() returned true in this case; however, it now returns
false, resulting in all sub-menu entries being skipped.

Here is a simplified test case illustrating the issue:

config A
bool "A" if X
default y

config B
bool "B"
depends on A

When X is disabled, A becomes unconfigurable and is forced to y.
B should be displayed, as its dependency is met.

This commit restores the necessary code, so menu_is_visible() functions
as it did previously.

Fixes: f79dc03fe68c ("kconfig: refactor choice value calculation")
Reported-by: Edmund Raile <edmund.raile@proton.me>
Closes: https://lore.kernel.org/all/5fd0dfc7ff171aa74352e638c276069a5f2e888d.camel@proton.me/
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+12 -1
+12 -1
scripts/kconfig/menu.c
··· 533 533 534 534 bool menu_is_visible(struct menu *menu) 535 535 { 536 + struct menu *child; 536 537 struct symbol *sym; 537 538 tristate visible; 538 539 ··· 552 551 } else 553 552 visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); 554 553 555 - return visible != no; 554 + if (visible != no) 555 + return true; 556 + 557 + if (!sym || sym_get_tristate_value(menu->sym) == no) 558 + return false; 559 + 560 + for (child = menu->list; child; child = child->next) 561 + if (menu_is_visible(child)) 562 + return true; 563 + 564 + return false; 556 565 } 557 566 558 567 const char *menu_get_prompt(const struct menu *menu)