]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: Disable GCOV_PROFILE_ALL on 32-bit UML with Clang 20/21
authorKees Cook <kees@kernel.org>
Thu, 9 Apr 2026 05:20:42 +0000 (22:20 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 10 Apr 2026 07:28:59 +0000 (09:28 +0200)
Clang 20 and 21 miscompute __builtin_object_size() when -fprofile-arcs
is active on 32-bit UML targets, which passes incorrect object size
calculations for local variables through always_inline copy_to_user()
and check_copy_size(), causing spurious compile-time errors:

  include/linux/ucopysize.h:52:4: error: call to '__bad_copy_from' declared with 'error' attribute: copy source size is too small

The regression was introduced in LLVM commit 02b8ee281947 ("[llvm]
Improve llvm.objectsize computation by computing GEP, alloca and malloc
parameters bound"), which shipped in Clang 20. It was fixed in LLVM
by commit 45b697e610fd ("[MemoryBuiltins] Consider index type size
when aggregating gep offsets"), which was backported to the LLVM 22.x
release branch.

The bug requires 32-bit UML + GCOV_PROFILE_ALL (which uses -fprofile-arcs),
though the exact trigger depends on optimizer decisions influenced by other
enabled configs.

Prevent the bad combination by disabling UML's ARCH_HAS_GCOV_PROFILE_ALL
on 32-bit when using Clang 20.x or 21.x.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202604030531.O6FveVgn-lkp@intel.com/
Suggested-by: Nathan Chancellor <nathan@kernel.org>
Assisted-by: Claude:claude-opus-4-6[1m]
Signed-off-by: Kees Cook <kees@kernel.org>
Link: https://patch.msgid.link/20260409052038.make.995-kees@kernel.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/Kconfig

index 098cda44db2255cd74c22400c9872e19d024d2c6..d9541d13d9eb06ed3bc06fd01bff4dbb525a3d24 100644 (file)
@@ -11,7 +11,9 @@ config UML
        select ARCH_HAS_CACHE_LINE_SIZE
        select ARCH_HAS_CPU_FINALIZE_INIT
        select ARCH_HAS_FORTIFY_SOURCE
-       select ARCH_HAS_GCOV_PROFILE_ALL
+       # Clang 20 & 21 miscompute __builtin_object_size() under -fprofile-arcs
+       # on 32-bit, causing spurious compile-time errors in check_copy_size().
+       select ARCH_HAS_GCOV_PROFILE_ALL if !(!64BIT && CLANG_VERSION >= 200000 && CLANG_VERSION < 220100)
        select ARCH_HAS_KCOV
        select ARCH_HAS_STRNCPY_FROM_USER
        select ARCH_HAS_STRNLEN_USER