Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm: drop arch implementation for find_bit() function family
find_next_bit(bitmap, nbits, off) should't touch memory if nbits == 0 or off >= nbits to avoid out-of-boundary access. Generic implementation of find_bit() has explicit check for this, but arm doesn't, which is spotted by KFENCE when running test_bitmap (see below). Instead of fixing arm implementation, just switch arm to use generic code. It's better optimized for small bitmaps with small_const_nbits(), and for long bitmaps too because fetches words with LDR, while arch code fetches bytes with LDRB BUG: KFENCE: out-of-bounds read in _find_next_bit_le (arch/arm/lib/findbit.S:88) Out-of-bounds read at 0xef59e000 (4096B right of kfence-torvalds#93): _find_next_bit_le (arch/arm/lib/findbit.S:88) kfence-torvalds#93: 0xef59d000-0xef59dfff, size=4096, cache=kmalloc-4k allocated by task 1 on cpu 1 at 18.432911s: test_bitmap_printlist (./include/linux/slab.h:600 lib/test_bitmap.c:452) test_bitmap_init (lib/test_bitmap.c:883 lib/test_bitmap.c:889) do_one_initcall (./include/linux/jump_label.h:261 ./include/linux/jump_label.h:271 ./include/trace/events/initcall.h:48 init/main.c:1296) kernel_init_freeable (init/main.c:1367 init/main.c:1384 init/main.c:1403 init/main.c:1610) kernel_init (init/main.c:1501) ret_from_fork (arch/arm/kernel/entry-common.S:149) 0x0 CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.19.0-rc8 #1 Hardware name: Samsung Exynos (Flattened Device Tree) PC is at _find_next_bit_le (arch/arm/lib/findbit.S:88) LR is at bitmap_list_string.constprop.0 (lib/vsprintf.c:1246) pc : lr : psr: 20000113 sp : f082dc70 ip : 00000001 fp : 00000001 r10: 00000000 r9 : 0000002d r8 : ef59d000 r7 : c0e55514 r6 : c2215000 r5 : 00008000 r4 : 00008000 r3 : 845cac12 r2 : 00008001 r1 : 00008000 r0 : ef59d000 Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none Control: 10c5387d Table: 4000406a DAC: 00000051 CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.19.0-rc8 #1 Hardware name: Samsung Exynos (Flattened Device Tree) unwind_backtrace from show_stack (arch/arm/kernel/traps.c:255) show_stack from dump_stack_lvl (lib/dump_stack.c:107) dump_stack_lvl from kfence_report_error (mm/kfence/report.c:262) kfence_report_error from kfence_handle_page_fault (mm/kfence/core.c:1151) kfence_handle_page_fault from __do_kernel_fault.part.0 (arch/arm/mm/fault.c:143) __do_kernel_fault.part.0 from do_page_fault (arch/arm/mm/fault.c:380) do_page_fault from do_DataAbort (arch/arm/mm/fault.c:539) do_DataAbort from __dabt_svc (arch/arm/kernel/entry-armv.S:214) Exception stack(0xf082dc20 to 0xf082dc68) dc20: ef59d000 00008000 00008001 845cac12 00008000 00008000 c2215000 c0e55514 dc40: ef59d000 0000002d 00000000 00000001 00000001 f082dc70 c0715930 c06ff18c dc60: 20000113 ffffffff __dabt_svc from _find_next_bit_le (arch/arm/lib/findbit.S:88) Reported-by: Guenter Roeck <linux@roeck-us.net> Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information