linux-uconsole/scripts/kconfig
Masahiro Yamada c77cbc8735 kconfig: fix missing choice values in auto.conf
commit 8e2442a5f8 upstream.

Since commit 00c864f890 ("kconfig: allow all config targets to write
auto.conf if missing"), Kconfig creates include/config/auto.conf in the
defconfig stage when it is missing.

Joonas Kylmälä reported incorrect auto.conf generation under some
circumstances.

To reproduce it, apply the following diff:

|  --- a/arch/arm/configs/imx_v6_v7_defconfig
|  +++ b/arch/arm/configs/imx_v6_v7_defconfig
|  @@ -345,14 +345,7 @@ CONFIG_USB_CONFIGFS_F_MIDI=y
|   CONFIG_USB_CONFIGFS_F_HID=y
|   CONFIG_USB_CONFIGFS_F_UVC=y
|   CONFIG_USB_CONFIGFS_F_PRINTER=y
|  -CONFIG_USB_ZERO=m
|  -CONFIG_USB_AUDIO=m
|  -CONFIG_USB_ETH=m
|  -CONFIG_USB_G_NCM=m
|  -CONFIG_USB_GADGETFS=m
|  -CONFIG_USB_FUNCTIONFS=m
|  -CONFIG_USB_MASS_STORAGE=m
|  -CONFIG_USB_G_SERIAL=m
|  +CONFIG_USB_FUNCTIONFS=y
|   CONFIG_MMC=y
|   CONFIG_MMC_SDHCI=y
|   CONFIG_MMC_SDHCI_PLTFM=y

And then, run:

$ make ARCH=arm mrproper imx_v6_v7_defconfig

You will see CONFIG_USB_FUNCTIONFS=y is correctly contained in the
.config, but not in the auto.conf.

Please note drivers/usb/gadget/legacy/Kconfig is included from a choice
block in drivers/usb/gadget/Kconfig. So USB_FUNCTIONFS is a choice value.

This is probably a similar situation described in commit beaaddb625
("kconfig: tests: test defconfig when two choices interact").

When sym_calc_choice() is called, the choice symbol forgets the
SYMBOL_DEF_USER unless all of its choice values are explicitly set by
the user.

The choice symbol is given just one chance to recall it because
set_all_choice_values() is called if SYMBOL_NEED_SET_CHOICE_VALUES
is set.

When sym_calc_choice() is called again, the choice symbol forgets it
forever, since SYMBOL_NEED_SET_CHOICE_VALUES is a one-time aid.
Hence, we cannot call sym_clear_all_valid() again and again.

It is crazy to repeat set and unset of internal flags. However, we
cannot simply get rid of "sym->flags &= flags | ~SYMBOL_DEF_USER;"
Doing so would re-introduce the problem solved by commit 5d09598d48
("kconfig: fix new choices being skipped upon config update").

To work around the issue, conf_write_autoconf() stopped calling
sym_clear_all_valid().

conf_write() must be changed accordingly. Currently, it clears
SYMBOL_WRITE after the symbol is written into the .config file. This
is needed to prevent it from writing the same symbol multiple times in
case the symbol is declared in two or more locations. I added the new
flag SYMBOL_WRITTEN, to track the symbols that have been written.

Anyway, this is a cheesy workaround in order to suppress the issue
as far as defconfig is concerned.

Handling of choices is totally broken. sym_clear_all_valid() is called
every time a user touches a symbol from the GUI interface. To reproduce
it, just add a new symbol drivers/usb/gadget/legacy/Kconfig, then touch
around unrelated symbols from menuconfig. USB_FUNCTIONFS will disappear
from the .config file.

I added the Fixes tag since it is more fatal than before. But, this
has been broken since long long time before, and still it is.
We should take a closer look to fix this correctly somehow.

Fixes: 00c864f890 ("kconfig: allow all config targets to write auto.conf if missing")
Cc: linux-stable <stable@vger.kernel.org> # 4.19+
Reported-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Tested-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-07-26 09:14:24 +02:00
..
lxdialog kconfig/[mn]conf: handle backspace (^H) key 2019-05-04 09:20:22 +02:00
tests kconfig: improve the recursive dependency report 2018-08-22 23:21:39 +09:00
.gitignore kconfig: drop localization support 2018-05-28 18:25:21 +09:00
conf.c kconfig: suppress "configuration written to .config" for syncconfig 2018-08-22 23:21:41 +09:00
confdata.c kconfig: fix missing choice values in auto.conf 2019-07-26 09:14:24 +02:00
expr.c kconfig: make unmet dependency warnings readable 2018-03-26 02:04:06 +09:00
expr.h kconfig: fix missing choice values in auto.conf 2019-07-26 09:14:24 +02:00
gconf-cfg.sh kconfig: do not require pkg-config on make {menu,n}config 2018-09-03 02:13:48 +09:00
gconf.c kconfig: allow all config targets to write auto.conf if missing 2018-07-25 23:25:30 +09:00
gconf.glade scripts/kconfig/gconf.glade Update broken web addresses. 2010-09-17 16:54:42 +02:00
images.c
kconf_id.c kconfig: reference environment variables directly and remove 'option env=' 2018-05-29 03:28:58 +09:00
list.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
lkc.h kconfig: remove unused sym_get_env_prop() function 2018-08-14 08:59:57 +09:00
lkc_proto.h kconfig: allow all config targets to write auto.conf if missing 2018-07-25 23:25:30 +09:00
Makefile kconfig: do not require pkg-config on make {menu,n}config 2018-09-03 02:13:48 +09:00
mconf-cfg.sh kconfig: do not require pkg-config on make {menu,n}config 2018-09-03 02:13:48 +09:00
mconf.c kconfig: remove a spurious self-assignment 2018-09-01 01:21:42 +09:00
menu.c kconfig: rename SYMBOL_AUTO to SYMBOL_NO_WRITE 2018-07-18 01:18:09 +09:00
merge_config.sh kconfig/merge_config.sh: Accept a single file 2015-10-14 16:19:37 +02:00
nconf-cfg.sh kconfig: do not require pkg-config on make {menu,n}config 2018-09-03 02:13:48 +09:00
nconf.c kconfig/[mn]conf: handle backspace (^H) key 2019-05-04 09:20:22 +02:00
nconf.gui.c kconfig/[mn]conf: handle backspace (^H) key 2019-05-04 09:20:22 +02:00
nconf.h kconfig: drop localization support 2018-05-28 18:25:21 +09:00
preprocess.c kconfig: loop boundary condition fix 2018-06-28 22:48:08 +09:00
qconf-cfg.sh kconfig: do not require pkg-config on make {menu,n}config 2018-09-03 02:13:48 +09:00
qconf.cc kconfig: remove P_ENV property type 2018-08-14 09:01:47 +09:00
qconf.h Port xconfig to Qt5 - Source format. 2015-10-14 14:59:03 +02:00
streamline_config.pl kconfig: fix localmodconfig 2018-06-11 09:16:30 +09:00
symbol.c kconfig: improve the recursive dependency report 2018-08-22 23:21:39 +09:00
util.c kconfig: rename file_write_dep and move it to confdata.c 2018-07-25 23:25:28 +09:00
zconf.l kconfig: fix memory leak when EOF is encountered in quotation 2019-01-26 09:32:39 +01:00
zconf.y kconfig: fix the rule of mainmenu_stmt symbol 2018-08-13 12:04:51 +09:00