• Dirk Gouders's avatar
    kconfig/menu.c: fix multiple references to expressions in menu_add_prop() · e983b7b1
    Dirk Gouders authored
    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: default avatarDirk Gouders <dirk@gouders.net>
    [yann.morin.1998@free.fr: move variable into its block-scope,
                              keep lines <80 chars, typo]
    Tested-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
    Reviewed-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
    Signed-off-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
    e983b7b1
menu.c 16.4 KB