⬢ DragonFlyBSD Kernel Audit
DF-3758 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/de/if_de.c
+++ b/sys/dev/netif/de/if_de.c
@@ -3131,11 +3131,17 @@ tulip_rx_intr(tulip_softc_t *sc)
 	    error = bus_dmamap_load_mbuf(ri->ri_data_tag, *nextout->di_map, ms,
 		tulip_dma_map_rxbuf, nextout->di_desc, BUS_DMA_NOWAIT);
 	    if (error) {
 		device_printf(sc->tulip_dev,
 		    "unable to load rx map, error = %d\n", error);
-		panic("tulip_rx_intr");		/* XXX */
+		/*
+		 * Back off instead of panicking: drop this chain and let
+		 * the watchdog retry replenishing, exactly like the
+		 * m_getcl() failure path above.
+		 */
+		m_freem(ms);
+		ms = NULL;
+		fillok = 0;
+		sc->tulip_flags |= TULIP_RXBUFSLOW;
+		break;
 	    }
 	    nextout->di_desc->d_status = TULIP_DSTS_OWNER;