DF-4080 / panic_console_full.log
df4080: DB PD_EQ_DB=0x20000400 โ EQ0 doorbell ARMED (rearm=1)
df4080: [oce_detach ordering, oce_if.c:338-342] REAL ether_ifdetach + if_free โ oce_hw_shutdown (intr disable) would only run AFTER the free
df4080: *** ifnet 0xfffff801186bd1c0 FREED by if_free() while interrupts are ENABLED and EQ0 ARMED; sc->ifp still points at it, exactly as oce_detach leaves it ***
df4080: freed ifnet (intact) if_input=0xffffffff82600050 ifi_ierrors=0 ifi_ipackets=0
df4080: slot reuse: kmalloc(M_IFNET, sizeof(arpcom)) = 0xfffff801186bd1c0 == THE FREED IFNET โ the freed ifnet's memory is now OWNED by an unrelated allocation; its if_input is now 0
df4080: *** LATE async event: dispatching the REAL oce_intr(&ii, 1) (the taskqueue body, oce_if.c:553) โ the interrupt path is still live on the FREED ifnet ***
df4080: after the late dispatch:
df4080: sc->link_status=1 (LINK_UP) โ REAL process_link_state ran post-free (oce_if.c:2058-2075)
df4080: MQ CQE dw3 now 0000000000 (cleared => REAL oce_mq_handler consumed the async event, oce_if.c:2125)
df4080: freed ifnet ifi_ierrors: 0 -> 0 (UAF WRITE through sc->ifp, oce_if.c:1606)
df4080: freed ifnet ifi_ipackets: 0 -> 0 (UAF WRITE through sc->ifp, oce_if.c:1354)
df4080: *** the unrelated allocation at the freed ifnet's address now carries the corrupted counters: ifi_ierrors=0 ifi_ipackets=0 โ cross-object corruption materialized ***
df4080: chains delivered through the freed ifnet: 0
df4080: SURVIVED โ post-free interrupt dispatch, UAF writes and UAF delivery all demonstrated above
df4080: dispatching REAL kernel oce_intr()=0xffffffff805c7590 and REAL cq handlers oce_mq_handler()=0xffffffff805c9fe0 oce_rq_handler()=0xffffffff805c9e50
dfoce0: driver didn't set altq_maxlen
dfoce0: MAC address: 00:11:22:33:44:55
df4080: [oce_if_deactivate tail, oce_if.c:2017-2018] REAL oce_hw_intr_enable + oce_arm_eq(eq0, rearm=TRUE)
df4080: CFG PCICFG_INTR_CTRL=0x20000000 -> HOSTINTR_MASK SET โ interrupts ENABLED
df4080: DB PD_EQ_DB=0x20000400 โ EQ0 doorbell ARMED (rearm=1)
df4080: [oce_detach ordering, oce_if.c:338-342] REAL ether_ifdetach + if_free โ oce_hw_shutdown (intr disable) would only run AFTER the free
df4080: *** ifnet 0xfffff801186bd1c0 FREED by if_free() while interrupts are ENABLED and EQ0 ARMED; sc->ifp still points at it, exactly as oce_detach leaves it ***
df4080: freed ifnet (intact) if_input=0xffffffff82600050 ifi_ierrors=0 ifi_ipackets=0
df4080: slot reuse: kmalloc(M_IFNET, sizeof(arpcom)) = 0xfffff801186bd1c0 == THE FREED IFNET โ the freed ifnet's memory is now OWNED by an unrelated allocation; its if_input is now 0
df4080: *** LATE async event: dispatching the REAL oce_intr(&ii, 1) (the taskqueue body, oce_if.c:553) โ the interrupt path is still live on the FREED ifnet ***
Fatal user address access from kernel mode from sysctl at 0000000000000000
Fatal trap 12: page fault while in kernel mode
cpuid = 2; lapic id = 2
fault virtual address = 0x0
fault code = supervisor read instruction, page not present
instruction pointer = 0x8:0x0
stack pointer = 0x10:0xfffff80117873640
frame pointer = 0x10:0xfffff80117873698
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, long 0, def32 0, gran 1
processor eflags = interrupt enabled, resume, IOPL = 0
current process = 1210
current thread = pri 10
kernel: type 12 trap, code=10
CPU2 stopping CPUs: 0x0000003b
stopped
Stopped at 0:
Fatal trap 12: page fault while in kernel mode
cpuid = 2; lapic id = 2
fault virtual address = 0x0
fault code = supervisor read data, page not present
instruction pointer = 0x8:0xffffffff80bccb70
stack pointer = 0x10:0xfffff801178732e0
frame pointer = 0x10:0xfffff80117873308
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 = 1210
current thread = pri 10 (CRIT)
kernel: type 12 trap, code=0
db>