DragonFlyBSD Kernel Audit
DF-0862 / panic.txt
← back to finding ↓ download raw
DF-0862 — kernel panic signature from dfbsd-qemu/boot.log (unpatched #0 GENERIC kernel,
INVARIANTS ON).  Trigger: mount of crafted HPFS image with su_btotal=0xFFFFC001.

---------------------------------------------------------------------------
vn4: MBR magic not found; assume a COMPATIBILITY_SLICE (s0)


Fatal trap 12: page fault while in kernel mode
cpuid = 0; lapic id = 0
fault virtual address	= 0xfffffffffffffff8
fault code		= supervisor read data, page not present
instruction pointer	= 0x8:0xffffffff82602800
stack pointer	        = 0x10:0xfffff80117ba3270
frame pointer	        = 0x10:0xfffff80117ba32b0
code segment		= base 0x0, limit 0xfffff, type 0x1b
			= DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags	= interrupt enabled, resume, IOPL = 0
current process		= 961
current thread          = pri 6
kernel: type 12 trap, code=0

CPU0 stopping CPUs: 0x0000003e
 stopped
Stopped at      hpfs_bminit+0x230:      movl    (%rax),%edi
db>
---------------------------------------------------------------------------

PROOF THIS IS THE BUG (not an unrelated panic):
  * fault VA 0xfffffffffffffff8 == ZERO_LENGTH_PTR == (void*)-8
    (sys/kern/kern_slaballoc.c:193), the sentinel returned by kmalloc(0)
    (sys/kern/kern_slaballoc.c:888-890).  hpm_dbnum wrapped to 0, so both
    hpmp->hpm_bmind and hpmp->hpm_bitmap became ZERO_LENGTH_PTR.
  * crash site hpfs_bminit+0x230 `movl (%rax),%edi` is the read
    ((u_int32_t *)hpmp->hpm_bitmap)[i] at sys/vfs/hpfs/hpfs_subr.c:159
    inside the `for(i=0;i<su_btotal>>5;i++)` loop at :156.  rax holds the
    ZERO_LENGTH_PTR; the first iteration faults on the non-canonical address.
  * The loop bound su_btotal>>5 = 0xFFFFC001>>5 = 0x07FFFE00 = 134,217,216,
    completely independent of the wrapped hpm_dbnum=0.