⬢ DragonFlyBSD Kernel Audit
DF-4538 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/sound/pci/cs4281.c
+++ b/sys/dev/sound/pci/cs4281.c
@@ -890,10 +890,13 @@
     /* power off */
     cs4281_power(sc, 3);
 
-    bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
-    bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem);
+    /* Tear the interrupt handler down before releasing the register
+     * mappings it reads (shared-IRQ window otherwise touches freed rman
+     * resources from cs4281_intr -> cs4281_rd(HISR/HDSR)). */
     bus_teardown_intr(dev, sc->irq, sc->ih);
     bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
+    bus_release_resource(dev, sc->regtype, sc->regid, sc->reg);
+    bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem);
     bus_dma_tag_destroy(sc->parent_dmat);
     kfree(sc, M_DEVBUF);