linux-kernelorg-stable/arch/parisc/kernel
Helge Deller fd9f30d103 parisc: Avoid crash due to unaligned access in unwinder
Guenter Roeck reported this kernel crash on his emulated B160L machine:

Starting network: udhcpc: started, v1.36.1
 Backtrace:
  [<104320d4>] unwind_once+0x1c/0x5c
  [<10434a00>] walk_stackframe.isra.0+0x74/0xb8
  [<10434a6c>] arch_stack_walk+0x28/0x38
  [<104e5efc>] stack_trace_save+0x48/0x5c
  [<105d1bdc>] set_track_prepare+0x44/0x6c
  [<105d9c80>] ___slab_alloc+0xfc4/0x1024
  [<105d9d38>] __slab_alloc.isra.0+0x58/0x90
  [<105dc80c>] kmem_cache_alloc_noprof+0x2ac/0x4a0
  [<105b8e54>] __anon_vma_prepare+0x60/0x280
  [<105a823c>] __vmf_anon_prepare+0x68/0x94
  [<105a8b34>] do_wp_page+0x8cc/0xf10
  [<105aad88>] handle_mm_fault+0x6c0/0xf08
  [<10425568>] do_page_fault+0x110/0x440
  [<10427938>] handle_interruption+0x184/0x748
  [<11178398>] schedule+0x4c/0x190
  BUG: spinlock recursion on CPU#0, ifconfig/2420
  lock: terminate_lock.2+0x0/0x1c, .magic: dead4ead, .owner: ifconfig/2420, .owner_cpu: 0

While creating the stack trace, the unwinder uses the stack pointer to guess
the previous frame to read the previous stack pointer from memory.  The crash
happens, because the unwinder tries to read from unaligned memory and as such
triggers the unalignment trap handler which then leads to the spinlock
recursion and finally to a deadlock.

Fix it by checking the alignment before accessing the memory.

Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Helge Deller <deller@gmx.de>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Cc: stable@vger.kernel.org # v6.12+
2025-11-04 12:21:59 +01:00
..
syscalls
vdso32
vdso64
.gitignore
Makefile
alternative.c
asm-offsets.c
audit.c
cache.c
compat_audit.c
drivers.c
entry.S
firmware.c
ftrace.c
hardware.c
head.S
hpmc.S
inventory.c
irq.c
jump_label.c
kexec.c
kexec_file.c
kgdb.c
kprobes.c
module.c
pacache.S
parisc_ksyms.c
patch.c
pci-dma.c
pci.c
pdc_chassis.c
pdc_cons.c
pdt.c
perf.c
perf_asm.S
perf_event.c
perf_images.h
perf_regs.c
process.c
processor.c
ptrace.c
real2.S
relocate_kernel.S
setup.c
signal.c
signal32.c
signal32.h
smp.c
stacktrace.c
sys_parisc.c
sys_parisc32.c
syscall.S
time.c
toc.c
toc_asm.S
topology.c
traps.c
unaligned.c
unaligned.h
unwind.c
vdso.c
vmlinux.lds.S