linux/arch/parisc
Helge Deller 9ac1f44723 parisc: Avoid crash due to unaligned access in unwinder
commit fd9f30d103 upstream.

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+
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-11-13 15:34:39 -05:00
..
boot parisc: fix building with gcc-15 2025-06-27 11:11:22 +01:00
configs drm/display: Make DisplayPort CEC-over-AUX Kconfig name consistent 2024-03-28 11:26:47 +01:00
include Fix access to video_is_primary_device() when compiled without CONFIG_VIDEO 2025-11-13 15:34:22 -05:00
kernel parisc: Avoid crash due to unaligned access in unwinder 2025-11-13 15:34:39 -05:00
lib parisc: Remove spurious if statement from raw_copy_from_user() 2025-10-19 16:33:52 +02:00
math-emu parisc: Fix double SIGFPE crash 2025-05-09 09:50:31 +02:00
mm parisc: Try to fixup kernel exception in bad_area_nosemaphore path of do_page_fault() 2025-08-28 16:31:00 +02:00
net parisc: fix unaligned accesses in BPF 2024-07-29 16:19:07 +02:00
video arch: Rename fbdev header and source files 2024-05-03 17:07:50 +02:00
defpalo.conf parisc: switch to gzip-compressed vmlinuz kernel 2013-07-09 22:09:20 +02:00
install.sh kbuild: Abort make on install failures 2024-07-20 13:34:54 +09:00
Kbuild parisc: Wire up eBPF JIT compiler 2023-08-22 10:24:47 +02:00
Kconfig parisc: Temporarily disable jump label support 2025-02-17 10:05:29 +01:00
Kconfig.debug parisc: Use page table locks only if DEBUG_KERNEL is enabled 2023-08-20 20:23:46 +02:00
Makefile parisc: Makefile: explain that 64BIT requires both 32-bit and 64-bit compilers 2025-08-28 16:31:00 +02:00