⬢ DragonFlyBSD Kernel Audit
DF-5519 / fix.diff
← back to finding ↓ download raw
--- a/sys/bus/isa/x86_64/isa_dma.c	2026-10-06 20:51:42.700616456 +0000
+++ b/sys/bus/isa/x86_64/isa_dma.c	2026-10-06 20:52:25.716057367 +0000
@@ -95,13 +95,13 @@
 {
 	void *buf;
 
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dma_init: channel out of range");
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dma_init: channel %d out of range\n", chan);
+		return (EINVAL);
+	}
 
 	if (dma_bouncebuf[chan] != NULL)
 		panic("isa_dma_init: impossible request");
-#endif
 
 	/* Try malloc() first.  It works better if it works. */
 	buf = kmalloc(bouncebufsize, M_DEVBUF, flags);
@@ -137,10 +137,10 @@
 int
 isa_dma_acquire(int chan)
 {
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dma_acquire: channel out of range");
-#endif
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dma_acquire: channel %d out of range\n", chan);
+		return (EINVAL);
+	}
 
 	if (dma_inuse & (1 << chan)) {
 		kprintf("isa_dma_acquire: channel %d already in use\n", chan);
@@ -159,10 +159,12 @@
 void
 isa_dma_release(int chan)
 {
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dma_release: channel out of range");
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dma_release: channel %d out of range\n", chan);
+		return;
+	}
 
+#ifdef DIAGNOSTIC
 	if ((dma_inuse & (1 << chan)) == 0)
 		kprintf("isa_dma_release: channel %d not in use\n", chan);
 #endif
@@ -188,10 +190,10 @@
 void
 isa_dmacascade(int chan)
 {
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dmacascade: channel out of range");
-#endif
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dmacascade: channel %d out of range\n", chan);
+		return;
+	}
 
 	/* set dma channel mode, and set dma channel mode */
 	if ((chan & 4) == 0) {
@@ -214,10 +216,12 @@
 	int waport;
 	caddr_t newaddr;
 
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dmastart: channel out of range");
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dmastart: channel %d out of range\n", chan);
+		return;
+	}
 
+#ifdef DIAGNOSTIC
 	if ((chan < 4 && nbytes > (1<<16))
 	    || (chan >= 4 && (nbytes > (1<<17) || (u_int)(uintptr_t)addr & 1)))
 		panic("isa_dmastart: impossible request");
@@ -333,10 +337,12 @@
 void
 isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)
 {  
-#ifdef DIAGNOSTIC
-	if (chan & ~VALID_DMA_MASK)
-		panic("isa_dmadone: channel out of range");
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dmadone: channel %d out of range\n", chan);
+		return;
+	}
 
+#ifdef DIAGNOSTIC
 	if ((dma_inuse & (1 << chan)) == 0)
 		kprintf("isa_dmadone: channel %d not acquired\n", chan);
 #endif
@@ -431,6 +437,11 @@
 	int	ffport, waport;
 	u_long	low1, high1, low2, high2;
 
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dmastatus: channel %d out of range\n", chan);
+		return (-1);
+	}
+
 	/* channel active? */
 	if ((dma_inuse & (1 << chan)) == 0) {
 		kprintf("isa_dmastatus: channel %d not active\n", chan);
@@ -482,6 +493,11 @@
 int
 isa_dmastop(int chan) 
 {
+	if (chan & ~VALID_DMA_MASK) {
+		kprintf("isa_dmastop: channel %d out of range\n", chan);
+		return (-1);
+	}
+
 	if ((dma_inuse & (1 << chan)) == 0)
 		kprintf("isa_dmastop: channel %d not acquired\n", chan);