{
  "finding_id": "DF-4414",
  "status": "not_reproduced",
  "reproduced": 0,
  "impact": "none",
  "confidence": "certain",
  "verdict": "DFly-specific livelock certain by trace: radeon_vm_fini():1250-1261 loops while (vm->va.rb_node) and only removes the node when radeon_bo_reserve() succeeds; reserve is interruptible (radeon_object.h:64-68) so an exiting signalled thread hitting a BO whose reservation another process holds mid-CS gets -ERESTARTSYS immediately and spins in kernel mode forever (unkillable thread, leaked vm+fd). Upstreams single-pass postorder walk only leaks. The audit guest has no radeon GPU so the hang cannot be triggered at runtime; trigger compiles and runs, exits at open()=ENOENT (run.log). Analysis-classified impact: local DoS (Medium).",
  "exploit_chain": "",
  "evidence": "VERDICT.md (livelock mechanism + upstream divergence); run.log (device-absent); fix.diff (uninterruptible reserve + bail-out)",
  "kernel_refs": [
    "sys/dev/drm/radeon/radeon_vm.c:1250",
    "sys/dev/drm/radeon/radeon_vm.c:1253",
    "sys/dev/drm/radeon/radeon_object.h:64"
  ],
  "poc_changes": "kernel uapi include replaced by self-contained radeon_abi.h",
  "attempts": 1,
  "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul  2 06:02:54 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64",
  "runtime_sec": 10,
  "guest_dirty": 1,
  "build_cmd": "cc -O2 -Wall -o /tmp/trigger_fini DF-4414/trigger_fini.c",
  "run_cmd": "/tmp/trigger_fini",
  "code_hash": "962811455eb66ec55bd8d934623e9986b4ce09ad1525ce8bc504ab2b6c7b96bd",
  "notes": "Introduced by the DFly interval-tree-mock rewrite of radeon_vm_fini() (upstream uses rbtree_postorder_for_each_entry_safe); not an inherited upstream bug.",
  "recommended_fix": "Use uninterruptible reserve for teardown and break (bounded leak, matching upstream) instead of spinning",
  "fix_status": "not_testable",
  "fix_baseline_reproduced": 0,
  "fix_patched_reproduced": 0,
  "fix_verdict": "fix validation impossible on this guest (no radeon GPU). fix.diff switches the reserve to no_intr=true and adds a bail-out branch.",
  "fix_evidence": "fix.diff (radeon_bo_reserve(bo, true) + break on failure)"
}