mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 08:28:13 +00:00
d2a02e3c8b
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:
|
||
---|---|---|
.. | ||
842 | ||
crypto | ||
dim | ||
fonts | ||
kunit | ||
livepatch | ||
lz4 | ||
lzo | ||
math | ||
mpi | ||
pldmfw | ||
raid6 | ||
reed_solomon | ||
test_fortify | ||
vdso | ||
xz | ||
zlib_deflate | ||
zlib_dfltcc | ||
zlib_inflate | ||
zstd | ||
.gitignore | ||
argv_split.c | ||
ashldi3.c | ||
ashrdi3.c | ||
asn1_decoder.c | ||
asn1_encoder.c | ||
assoc_array.c | ||
atomic64.c | ||
atomic64_test.c | ||
audit.c | ||
bcd.c | ||
bch.c | ||
bitfield_kunit.c | ||
bitmap.c | ||
bitrev.c | ||
bootconfig.c | ||
bsearch.c | ||
btree.c | ||
bucket_locks.c | ||
bug.c | ||
build_OID_registry | ||
buildid.c | ||
bust_spinlocks.c | ||
check_signature.c | ||
checksum.c | ||
clz_ctz.c | ||
clz_tab.c | ||
cmdline.c | ||
cmdline_kunit.c | ||
cmpdi2.c | ||
compat_audit.c | ||
cpu_rmap.c | ||
cpumask.c | ||
crc-ccitt.c | ||
crc-itu-t.c | ||
crc-t10dif.c | ||
crc4.c | ||
crc7.c | ||
crc8.c | ||
crc16.c | ||
crc32.c | ||
crc32defs.h | ||
crc32test.c | ||
crc64.c | ||
ctype.c | ||
debug_info.c | ||
debug_locks.c | ||
debugobjects.c | ||
dec_and_lock.c | ||
decompress.c | ||
decompress_bunzip2.c | ||
decompress_inflate.c | ||
decompress_unlz4.c | ||
decompress_unlzma.c | ||
decompress_unlzo.c | ||
decompress_unxz.c | ||
decompress_unzstd.c | ||
devmem_is_allowed.c | ||
devres.c | ||
digsig.c | ||
dump_stack.c | ||
dynamic_debug.c | ||
dynamic_queue_limits.c | ||
earlycpio.c | ||
errname.c | ||
error-inject.c | ||
errseq.c | ||
extable.c | ||
fault-inject-usercopy.c | ||
fault-inject.c | ||
fdt.c | ||
fdt_addresses.c | ||
fdt_empty_tree.c | ||
fdt_ro.c | ||
fdt_rw.c | ||
fdt_strerror.c | ||
fdt_sw.c | ||
fdt_wip.c | ||
find_bit.c | ||
find_bit_benchmark.c | ||
flex_proportions.c | ||
gen_crc32table.c | ||
gen_crc64table.c | ||
genalloc.c | ||
generic-radix-tree.c | ||
glob.c | ||
globtest.c | ||
hexdump.c | ||
hweight.c | ||
idr.c | ||
inflate.c | ||
interval_tree.c | ||
interval_tree_test.c | ||
iomap.c | ||
iomap_copy.c | ||
iommu-helper.c | ||
iov_iter.c | ||
irq_poll.c | ||
irq_regs.c | ||
is_single_threaded.c | ||
kasprintf.c | ||
Kconfig | ||
Kconfig.debug | ||
Kconfig.kasan | ||
Kconfig.kcsan | ||
Kconfig.kfence | ||
Kconfig.kgdb | ||
Kconfig.ubsan | ||
kfifo.c | ||
klist.c | ||
kobject.c | ||
kobject_uevent.c | ||
kstrtox.c | ||
kstrtox.h | ||
libcrc32c.c | ||
linear_ranges.c | ||
list-test.c | ||
list_debug.c | ||
list_sort.c | ||
llist.c | ||
locking-selftest-hardirq.h | ||
locking-selftest-mutex.h | ||
locking-selftest-rlock-hardirq.h | ||
locking-selftest-rlock-softirq.h | ||
locking-selftest-rlock.h | ||
locking-selftest-rsem.h | ||
locking-selftest-rtmutex.h | ||
locking-selftest-softirq.h | ||
locking-selftest-spin-hardirq.h | ||
locking-selftest-spin-softirq.h | ||
locking-selftest-spin.h | ||
locking-selftest-wlock-hardirq.h | ||
locking-selftest-wlock-softirq.h | ||
locking-selftest-wlock.h | ||
locking-selftest-wsem.h | ||
locking-selftest.c | ||
lockref.c | ||
logic_iomem.c | ||
logic_pio.c | ||
lru_cache.c | ||
lshrdi3.c | ||
Makefile | ||
memcat_p.c | ||
memcpy_kunit.c | ||
memory-notifier-error-inject.c | ||
memregion.c | ||
memweight.c | ||
muldi3.c | ||
net_utils.c | ||
netdev-notifier-error-inject.c | ||
nlattr.c | ||
nmi_backtrace.c | ||
nodemask.c | ||
notifier-error-inject.c | ||
notifier-error-inject.h | ||
objagg.c | ||
of-reconfig-notifier-error-inject.c | ||
oid_registry.c | ||
once.c | ||
packing.c | ||
parman.c | ||
parser.c | ||
pci_iomap.c | ||
percpu-refcount.c | ||
percpu_counter.c | ||
percpu_test.c | ||
plist.c | ||
pm-notifier-error-inject.c | ||
radix-tree.c | ||
random32.c | ||
ratelimit.c | ||
rbtree.c | ||
rbtree_test.c | ||
ref_tracker.c | ||
refcount.c | ||
rhashtable.c | ||
sbitmap.c | ||
scatterlist.c | ||
seq_buf.c | ||
sg_pool.c | ||
sg_split.c | ||
sha1.c | ||
show_mem.c | ||
siphash.c | ||
slub_kunit.c | ||
smp_processor_id.c | ||
sort.c | ||
stackdepot.c | ||
stmp_device.c | ||
string.c | ||
string_helpers.c | ||
strncpy_from_user.c | ||
strnlen_user.c | ||
syscall.c | ||
test-kstrtox.c | ||
test-string_helpers.c | ||
test_bitmap.c | ||
test_bitops.c | ||
test_bits.c | ||
test_blackhole_dev.c | ||
test_bpf.c | ||
test_debug_virtual.c | ||
test_firmware.c | ||
test_fpu.c | ||
test_free_pages.c | ||
test_hash.c | ||
test_hexdump.c | ||
test_hmm.c | ||
test_hmm_uapi.h | ||
test_ida.c | ||
test_kasan.c | ||
test_kasan_module.c | ||
test_kmod.c | ||
test_kprobes.c | ||
test_linear_ranges.c | ||
test_list_sort.c | ||
test_lockup.c | ||
test_memcat_p.c | ||
test_meminit.c | ||
test_min_heap.c | ||
test_module.c | ||
test_objagg.c | ||
test_overflow.c | ||
test_parman.c | ||
test_printf.c | ||
test_ref_tracker.c | ||
test_rhashtable.c | ||
test_scanf.c | ||
test_siphash.c | ||
test_sort.c | ||
test_stackinit.c | ||
test_static_key_base.c | ||
test_static_keys.c | ||
test_string.c | ||
test_strscpy.c | ||
test_sysctl.c | ||
test_ubsan.c | ||
test_user_copy.c | ||
test_uuid.c | ||
test_vmalloc.c | ||
test_xarray.c | ||
textsearch.c | ||
timerqueue.c | ||
ts_bm.c | ||
ts_fsm.c | ||
ts_kmp.c | ||
ubsan.c | ||
ubsan.h | ||
ucmpdi2.c | ||
ucs2_string.c | ||
usercopy.c | ||
uuid.c | ||
vsprintf.c | ||
win_minmax.c | ||
xarray.c | ||
xxhash.c |