mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10:00 
			
		
		
		
	
				blake2s_compress_generic is weakly aliased by blake2s_compress. The
current harness for function selection uses a function pointer, which is
ordinarily inlined and resolved at compile time. But when Clang's CFI is
enabled, CFI still triggers when making an indirect call via a weak
symbol. This seems like a bug in Clang's CFI, as though it's bucketing
weak symbols and strong symbols differently. It also only seems to
trigger when "full LTO" mode is used, rather than "thin LTO".
[    0.000000][    T0] Kernel panic - not syncing: CFI failure (target: blake2s_compress_generic+0x0/0x1444)
[    0.000000][    T0] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.16.0-mainline-06981-g076c855b846e #1
[    0.000000][    T0] Hardware name: MT6873 (DT)
[    0.000000][    T0] Call trace:
[    0.000000][    T0]  dump_backtrace+0xfc/0x1dc
[    0.000000][    T0]  dump_stack_lvl+0xa8/0x11c
[    0.000000][    T0]  panic+0x194/0x464
[    0.000000][    T0]  __cfi_check_fail+0x54/0x58
[    0.000000][    T0]  __cfi_slowpath_diag+0x354/0x4b0
[    0.000000][    T0]  blake2s_update+0x14c/0x178
[    0.000000][    T0]  _extract_entropy+0xf4/0x29c
[    0.000000][    T0]  crng_initialize_primary+0x24/0x94
[    0.000000][    T0]  rand_initialize+0x2c/0x6c
[    0.000000][    T0]  start_kernel+0x2f8/0x65c
[    0.000000][    T0]  __primary_switched+0xc4/0x7be4
[    0.000000][    T0] Rebooting in 5 seconds..
Nonetheless, the function pointer method isn't so terrific anyway, so
this patch replaces it with a simple boolean, which also gets inlined
away. This successfully works around the Clang bug.
In general, I'm not too keen on all of the indirection involved here; it
clearly does more harm than good. Hopefully the whole thing can get
cleaned up down the road when lib/crypto is overhauled more
comprehensively. But for now, we go with a simple bandaid.
Fixes: 
		
	
					 | 
			||
|---|---|---|
| .. | ||
| .gitignore | ||
| aegis128-aesni-asm.S | ||
| aegis128-aesni-glue.c | ||
| aes_ctrby8_avx-x86_64.S | ||
| aesni-intel_asm.S | ||
| aesni-intel_avx-x86_64.S | ||
| aesni-intel_glue.c | ||
| blake2s-core.S | ||
| blake2s-glue.c | ||
| blake2s-shash.c | ||
| blowfish_glue.c | ||
| blowfish-x86_64-asm_64.S | ||
| camellia_aesni_avx2_glue.c | ||
| camellia_aesni_avx_glue.c | ||
| camellia_glue.c | ||
| camellia-aesni-avx2-asm_64.S | ||
| camellia-aesni-avx-asm_64.S | ||
| camellia-x86_64-asm_64.S | ||
| camellia.h | ||
| cast5_avx_glue.c | ||
| cast5-avx-x86_64-asm_64.S | ||
| cast6_avx_glue.c | ||
| cast6-avx-x86_64-asm_64.S | ||
| chacha_glue.c | ||
| chacha-avx2-x86_64.S | ||
| chacha-avx512vl-x86_64.S | ||
| chacha-ssse3-x86_64.S | ||
| crc32-pclmul_asm.S | ||
| crc32-pclmul_glue.c | ||
| crc32c-intel_glue.c | ||
| crc32c-pcl-intel-asm_64.S | ||
| crct10dif-pcl-asm_64.S | ||
| crct10dif-pclmul_glue.c | ||
| curve25519-x86_64.c | ||
| des3_ede_glue.c | ||
| des3_ede-asm_64.S | ||
| ecb_cbc_helpers.h | ||
| ghash-clmulni-intel_asm.S | ||
| ghash-clmulni-intel_glue.c | ||
| glue_helper-asm-avx2.S | ||
| glue_helper-asm-avx.S | ||
| Makefile | ||
| nh-avx2-x86_64.S | ||
| nh-sse2-x86_64.S | ||
| nhpoly1305-avx2-glue.c | ||
| nhpoly1305-sse2-glue.c | ||
| poly1305_glue.c | ||
| poly1305-x86_64-cryptogams.pl | ||
| serpent_avx2_glue.c | ||
| serpent_avx_glue.c | ||
| serpent_sse2_glue.c | ||
| serpent-avx2-asm_64.S | ||
| serpent-avx-x86_64-asm_64.S | ||
| serpent-avx.h | ||
| serpent-sse2-i586-asm_32.S | ||
| serpent-sse2-x86_64-asm_64.S | ||
| serpent-sse2.h | ||
| sha1_avx2_x86_64_asm.S | ||
| sha1_ni_asm.S | ||
| sha1_ssse3_asm.S | ||
| sha1_ssse3_glue.c | ||
| sha256_ni_asm.S | ||
| sha256_ssse3_glue.c | ||
| sha256-avx2-asm.S | ||
| sha256-avx-asm.S | ||
| sha256-ssse3-asm.S | ||
| sha512_ssse3_glue.c | ||
| sha512-avx2-asm.S | ||
| sha512-avx-asm.S | ||
| sha512-ssse3-asm.S | ||
| sm4_aesni_avx2_glue.c | ||
| sm4_aesni_avx_glue.c | ||
| sm4-aesni-avx2-asm_64.S | ||
| sm4-aesni-avx-asm_64.S | ||
| sm4-avx.h | ||
| twofish_avx_glue.c | ||
| twofish_glue_3way.c | ||
| twofish_glue.c | ||
| twofish-avx-x86_64-asm_64.S | ||
| twofish-i586-asm_32.S | ||
| twofish-x86_64-asm_64-3way.S | ||
| twofish-x86_64-asm_64.S | ||
| twofish.h | ||