twx-linux/scripts
Masahiro Yamada 2b6e818fc6 kconfig: fix comparison to constant symbols, 'm', 'n'
[ Upstream commit aabdc960a283ba78086b0bf66ee74326f49e218e ]

Currently, comparisons to 'm' or 'n' result in incorrect output.

[Test Code]

    config MODULES
            def_bool y
            modules

    config A
            def_tristate m

    config B
            def_bool A > n

CONFIG_B is unset, while CONFIG_B=y is expected.

The reason for the issue is because Kconfig compares the tristate values
as strings.

Currently, the .type fields in the constant symbol definitions,
symbol_{yes,mod,no} are unspecified, i.e., S_UNKNOWN.

When expr_calc_value() evaluates 'A > n', it checks the types of 'A' and
'n' to determine how to compare them.

The left-hand side, 'A', is a tristate symbol with a value of 'm', which
corresponds to a numeric value of 1. (Internally, 'y', 'm', and 'n' are
represented as 2, 1, and 0, respectively.)

The right-hand side, 'n', has an unknown type, so it is treated as the
string "n" during the comparison.

expr_calc_value() compares two values numerically only when both can
have numeric values. Otherwise, they are compared as strings.

    symbol    numeric value    ASCII code
    -------------------------------------
      y           2             0x79
      m           1             0x6d
      n           0             0x6e

'm' is greater than 'n' if compared numerically (since 1 is greater
than 0), but smaller than 'n' if compared as strings (since the ASCII
code 0x6d is smaller than 0x6e).

Specifying .type=S_TRISTATE for symbol_{yes,mod,no} fixes the above
test code.

Doing so, however, would cause a regression to the following test code.

[Test Code 2]

    config MODULES
            def_bool n
            modules

    config A
            def_tristate n

    config B
            def_bool A = m

You would get CONFIG_B=y, while CONFIG_B should not be set.

The reason is because sym_get_string_value() turns 'm' into 'n' when the
module feature is disabled. Consequently, expr_calc_value() evaluates
'A = n' instead of 'A = m'. This oddity has been hidden because the type
of 'm' was previously S_UNKNOWN instead of S_TRISTATE.

sym_get_string_value() should not tweak the string because the tristate
value has already been correctly calculated. There is no reason to
return the string "n" where its tristate value is mod.

Fixes: 31847b67bec0 ("kconfig: allow use of relations other than (in)equality")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-06-12 11:12:58 +02:00
..
atomic locking/atomic: scripts: fix fallback ifdeffery 2023-09-20 09:39:03 +02:00
basic
clang-tools gen_compile_commands: fix invalid escape sequence warning 2024-03-26 18:19:11 -04:00
coccinelle
dtc dt: dt-extract-compatibles: Don't follow symlinks when walking tree 2023-12-13 18:45:03 +01:00
dummy-tools
gcc-plugins gcc-plugins/stackleak: Avoid .head.text section 2024-04-13 13:07:40 +02:00
gdb scripts/gdb: fix lx-device-list-bus and lx-device-list-class 2023-12-13 18:45:19 +01:00
genksyms
kconfig kconfig: fix comparison to constant symbols, 'm', 'n' 2024-06-12 11:12:58 +02:00
ksymoops
mod modpost: fix null pointer dereference 2024-04-13 13:07:39 +02:00
package kbuild: remove stale code for 'source' symlink in packaging scripts 2023-10-01 23:06:06 +09:00
selinux
tracing
.gitignore
as-version.sh
asn1_compiler.c
bloat-o-meter
bootgraph.pl
bpf_doc.py scripts/bpf_doc: Use silent mode when exec make cmd 2024-04-10 16:35:40 +02:00
cc-can-link.sh
cc-version.sh
check_extable.sh
check-git
check-sysctl-docs
checkdeclares.pl
checkincludes.pl
checkkconfigsymbols.py
checkpatch.pl
checkstack.pl scripts/checkstack.pl: match all stack sizes for s390 2023-12-20 17:01:59 +01:00
checksyscalls.sh
checkversion.pl
cleanfile
cleanpatch
coccicheck
config
const_structs.checkpatch
decode_stacktrace.sh scripts/decode_stacktrace.sh: optionally use LLVM utilities 2024-01-20 11:51:49 +01:00
decodecode
depmod.sh
dev-needs.sh
diffconfig
documentation-file-ref-check
export_report.pl
extract_xc3028.pl
extract-ikconfig
extract-module-sig.pl
extract-sys-certs.pl
extract-vmlinux
faddr2line
file-size.sh
find-unused-docs.sh
gcc-x86_32-has-stack-protector.sh
gcc-x86_64-has-stack-protector.sh
gen-randstruct-seed.sh
generate_initcall_order.pl
generate_rust_analyzer.py
generate_rust_target.rs
get_abi.pl scripts/get_abi: fix source path leak 2024-01-31 16:18:55 -08:00
get_dvb_firmware
get_feat.pl
get_maintainer.pl
gfp-translate
head-object-list.txt
headerdep.pl
headers_install.sh
insert-sys-cert.c
install.sh
jobserver-exec
kallsyms.c
Kbuild.include
Kconfig.include kbuild: Add -Wa,--fatal-warnings to as-instr invocation 2024-03-06 14:48:41 +00:00
kernel-doc
ld-version.sh
leaking_addresses.pl
Lindent
link-vmlinux.sh kbuild: Fix changing ELF file type for output of gen_btf for big endian 2024-02-23 09:25:02 +01:00
Makefile
Makefile.asm-generic
Makefile.build kbuild: rust: force alloc extern to allow "empty" Rust files 2024-05-02 16:32:42 +02:00
Makefile.clang
Makefile.clean
Makefile.compiler kbuild: Add -Wa,--fatal-warnings to as-instr invocation 2024-03-06 14:48:41 +00:00
Makefile.debug
Makefile.defconf
Makefile.dtbinst
Makefile.extrawarn kbuild: Move -Wenum-{compare-conditional,enum-conversion} into W=1 2024-04-03 15:28:29 +02:00
Makefile.gcc-plugins
Makefile.headersinst
Makefile.host
Makefile.kasan
Makefile.kcov
Makefile.kcsan
Makefile.kmsan
Makefile.lib
Makefile.modfinal kbuild: Disable KCSAN for autogenerated *.mod.c intermediaries 2024-05-17 12:02:12 +02:00
Makefile.modinst kbuild: Use CRC32 and a 1MiB dictionary for XZ compressed modules 2023-09-25 16:01:05 +09:00
Makefile.modpost
Makefile.package
Makefile.randstruct
Makefile.ubsan
Makefile.userprogs
Makefile.vdsoinst s390/vdso: Create .build-id links for unstripped vdso files 2024-06-12 11:12:33 +02:00
Makefile.vmlinux x86/retpoline: Make sure there are no unconverted return thunks due to KCSAN 2023-11-28 17:19:36 +00:00
Makefile.vmlinux_o x86/srso: Fix unret validation dependencies 2023-11-20 11:58:52 +01:00
makelst
markup_oops.pl
min-tool-version.sh rust: upgrade to Rust 1.73.0 2024-02-16 19:10:43 +01:00
misc-check
mkcompile_h
mksysmap kallsyms: ignore ARMv4 thunks along with others 2024-02-23 09:24:59 +01:00
mkuboot.sh
module.lds.S modules: Drop the .export_symbol section from the final modules 2024-06-12 11:12:12 +02:00
modules-check.sh
nsdeps
objdiff
objdump-func
orc_hash.sh
pahole-flags.sh
pahole-version.sh
parse-maintainers.pl
patch-kernel
profile2linkerlist.pl
prune-kernel
recordmcount.c
recordmcount.h
recordmcount.pl
relocs_check.sh
remove-stale-files
rust_is_available_bindgen_libclang.h
rust_is_available_test.py
rust_is_available.sh
rustdoc_test_builder.rs
rustdoc_test_gen.rs
setlocalversion
show_delta
sign-file.c sign-file: Fix incorrect return values check 2023-12-20 17:01:49 +01:00
sorttable.c
sorttable.h
spdxcheck-test.sh
spdxcheck.py
spdxexclude
spelling.txt
sphinx-pre-install
split-man.pl
stackdelta
stackusage
subarch.include
syscallhdr.sh
syscallnr.sh
syscalltbl.sh
tags.sh
test_fortify.sh
tools-support-relr.sh
unifdef.c
ver_linux
xen-hypercalls.sh
xz_wrap.sh