⬢ DragonFlyBSD Kernel Audit
DF-4969 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/disk/advansys/adw_pci.c
+++ b/sys/dev/disk/advansys/adw_pci.c
@@ -234,6 +234,7 @@
 	 */
 	if (adw_find_signature(adw) == 0) {
 		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
 		return (ENXIO);
 	}
 
@@ -241,8 +242,11 @@
 
 	error = entry->setup(dev, entry, adw);
 
-	if (error != 0)
+	if (error != 0) {
+		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
 		return (error);
+	}
 
 	/* Ensure busmastering is enabled */
 	command |= PCIM_CMD_BUSMASTEREN;
@@ -266,6 +270,7 @@
 		kprintf("%s: Could not allocate DMA tag - error %d\n",
 		       adw_name(adw), error);
 		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
 		return (error);
 	}
 
@@ -274,6 +279,7 @@
 	error = adw_init(adw);
 	if (error != 0) {
 		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
 		return (error);
 	}
 
@@ -294,12 +300,16 @@
 				      0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
 	if (adw->irq == NULL) {
 		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
 		return (ENOMEM);
 	}
 
 	error = adw_attach(adw);
-	if (error != 0)
+	if (error != 0) {
+		bus_release_resource(dev, adw->irq_res_type, 0, adw->irq);
 		adw_free(adw);
+		bus_release_resource(dev, regs_type, regs_id, regs);
+	}
 	return (error);
 }