⬢ DragonFlyBSD Kernel Audit
DF-4311 / fix.log
← back to finding ↓ download raw
DF-4311 fix validation run (patched kernel modules, same guest image)
=====================================================================
Applied fix.diff to guest /usr/src, rebuilt vga_switcheroo.ko with the
MOD_UNLOAD guard + MOD_SHUTDOWN split, rebuilt uaftrig.ko with
MODULE_DEPEND(uaftrig, vga_switcheroo, 1, 1, 1)  (models the
MODULE_DEPEND(drm/i915/amdgpu, vga_switcheroo, ...) hunks of fix.diff).

Commands (as root):
  kldload /root/vgafixed/vga_switcheroo.ko
  kldload /root/uaftrig/uaftrig.ko
  echo trigger > /dev/uaftrig                      # baseline
  kldunload vga_switcheroo                         # attempt while dependent loaded
  kldstat
  echo trigger-after > /dev/uaftrig                # previously PANICKED the kernel
  kldunload uaftrig                                # chained real unload
  kldstat

Output (verbatim):

load vga(fixed) rc=0
load uaftrig(deps) rc=0
baseline rc=0
uaftrig: vga_switcheroo_lock_ddc(NULL) = -19
uaftrig: vga_switcheroo_unlock_ddc(NULL) = -19
--- unload attempt (expect: NO real unload; ref drop) ---
kldunload rc=0
 2    1 0xffffffff81cd9000    7c288 ehci.ko
 3    1 0xffffffff82600000 ... xhci.ko
 4    1 0xffffffff82600000     2000 vga_switcheroo.ko     <-- STILL RESIDENT
 5    1 0xffffffff82602000     1000 uaftrig.ko
--- trigger after unload attempt ---
trigger rc=0
uaftrig: vga_switcheroo_lock_ddc(NULL) = -19              <-- NO PANIC
uaftrig: vga_switcheroo_unlock_ddc(NULL) = -19
--- full cleanup: unload uaftrig then vga ---
uaftrig unload rc=0
kldunload: can't find file vga_switcheroo: No such file or directory
vga unload#2 rc=1                                          <-- already chained-unloaded
 1    5 0xffffffff80200000  1ad8538 kernel
 2    1 0xffffffff81cd9000    7c288 ehci.ko
 3    1 0xffffffff81d56000    8c778 xhci.ko              <-- both gone, clean
uaftrig: vga_switcheroo_unlock_ddc(NULL) = -19
vga_switcheroo device unloaded

Result:
  baseline panic-op now returns -19/-19 with the guest fully alive;
  the dependent module keeps vga_switcheroo resident (kldstat id 4);
  the true unload happens automatically only after the last dependent
  (uaftrig) unloads, via the linker dependency chain
  (kern_linker.c linker_load_dependencies -> refs++ -> unload drops ref).
FIX VALIDATED: fixed (baseline reproduced pre-fix, patched run clean).