From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx10.gouders.net ([89.244.147.155]:42889 "EHLO mx10.gouders.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751648Ab3EUMgp (ORCPT ); Tue, 21 May 2013 08:36:45 -0400 From: Dirk Gouders Subject: Re: [PATCH] kconfig/menu.c: fix multiple references to expressions in menu_add_prop() In-Reply-To: <1369126451-11930-1-git-send-email-dirk@gouders.net> (Dirk Gouders's message of "Tue, 21 May 2013 10:54:11 +0200") References: <1369126451-11930-1-git-send-email-dirk@gouders.net> Date: Tue, 21 May 2013 14:36:28 +0200 Message-ID: MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kbuild-owner@vger.kernel.org List-ID: To: linux-kbuild@vger.kernel.org Cc: Jan Beulich CCing the original author of the code (commit 7ad1227818f09 "kconfig: fix undesirable side effect of adding "visible" menu attribute"). Dirk Dirk Gouders writes: > 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 > --- > scripts/kconfig/menu.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c > index b5c7d90..567939c 100644 > --- a/scripts/kconfig/menu.c > +++ b/scripts/kconfig/menu.c > @@ -143,14 +143,25 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e > > /* Apply all upper menus' visibilities to actual prompts. */ > if(type == P_PROMPT) { > + struct expr *dup_expr; > struct menu *menu = current_entry; > > while ((menu = menu->parent) != NULL) { > if (!menu->visibility) > continue; > + /* > + * Do not add a reference to the > + * menu's visibility expression but > + * use a copy of it. Otherwise the > + * expression reduction functions > + * will modify expressions that have > + * multiple references which can > + * cause unwanted side-effects. > + */ > + dup_expr = expr_copy(menu->visibility); > + > prop->visible.expr > - = expr_alloc_and(prop->visible.expr, > - menu->visibility); > + = expr_alloc_and(prop->visible.expr, dup_expr); > } > }