mirror of
https://github.com/torvalds/linux.git
synced 2025-11-09 05:00:09 +02:00
menu_add_prop() applies upper menus' visibilities to actual prompts
by AND-ing the prompts visibilities with the upper menus ones.
This creates a further reference to the menu's visibilities and when
the expression reduction functions do their work, they may remove or
modify expressions that have multiple references, thus causing
unpredictable side-effects.
The following example Kconfig constructs a case where this causes
problems: a menu and a prompt which's visibilities depend on the same
symbol. When invoking mconf with this Kconfig and pressing "Z" we
see a problem caused by a free'd expression still referenced by the
menu's visibility:
------------------------------------------------------------------------
mainmenu "Kconfig Testing Configuration"
config VISIBLE
def_bool n
config Placeholder
bool "Place holder"
menu "Invisible"
visible if VISIBLE
config TEST_VAR
bool "Test option" if VISIBLE
endmenu
------------------------------------------------------------------------
This patch fixes this problem by creating copies of the menu's
visibility expressions before AND-ing them with the prompt's one.
Signed-off-by: Dirk Gouders <dirk@gouders.net>
[yann.morin.1998@free.fr: move variable into its block-scope,
keep lines <80 chars, typo]
Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
|
||
|---|---|---|
| .. | ||
| lxdialog | ||
| .gitignore | ||
| check.sh | ||
| conf.c | ||
| confdata.c | ||
| expr.c | ||
| expr.h | ||
| gconf.c | ||
| gconf.glade | ||
| images.c | ||
| kxgettext.c | ||
| list.h | ||
| lkc.h | ||
| lkc_proto.h | ||
| Makefile | ||
| mconf.c | ||
| menu.c | ||
| merge_config.sh | ||
| nconf.c | ||
| nconf.gui.c | ||
| nconf.h | ||
| POTFILES.in | ||
| qconf.cc | ||
| qconf.h | ||
| streamline_config.pl | ||
| symbol.c | ||
| util.c | ||
| zconf.gperf | ||
| zconf.hash.c_shipped | ||
| zconf.l | ||
| zconf.lex.c_shipped | ||
| zconf.tab.c_shipped | ||
| zconf.y | ||