--- a/sys/dev/netif/de/if_de.c +++ b/sys/dev/netif/de/if_de.c @@ -2078,10 +2078,12 @@ tulip_srom_decode(tulip_softc_t *sc) tulip_srom_media_t srom_media; tulip_media_info_t *mi = sc->tulip_mediainfo; const uint8_t *dp; uint32_t leaf_offset, blocks, data; + const tulip_media_info_t * const l_mi_end = + &sc->tulip_mediainfo[__arraycount(sc->tulip_mediainfo)]; for (idx1 = 0; idx1 < shp->sh_adapter_count; idx1++, saip++) { if (shp->sh_adapter_count == 1) break; @@ -2119,6 +2121,10 @@ tulip_srom_decode(tulip_softc_t *sc) if (sc->tulip_chipid == TULIP_21041) { blocks = *dp++; for (idx2 = 0; idx2 < blocks; idx2++) { + if (mi >= l_mi_end) { + /* no more media slots: stop decoding blocks */ + break; + } tulip_media_t media; data = *dp++; srom_media = (tulip_srom_media_t) (data & 0x3F); @@ -2182,6 +2188,10 @@ tulip_srom_decode(tulip_softc_t *sc) sc->tulip_gpinit = *dp++; blocks = *dp++; for (idx2 = 0; idx2 < blocks; idx2++) { + if (mi >= l_mi_end) { + /* no more media slots: stop decoding blocks */ + break; + } const uint8_t *ep; if ((*dp & 0x80) == 0) { length = 4;