DF-5302 / fix.diff
--- a/sys/bus/firewire/fwohci.c +++ b/sys/bus/firewire/fwohci.c @@ -1187,6 +1187,11 @@ fwohci_db_init(struct fwohci_softc *sc, struct fwohci_dbch *dbch) if ((dbch->flags & FWOHCI_DBCH_INIT) != 0) goto out; + if (dbch->ndb == 0) { + /* invalid ring: never dereference an empty db_trq */ + return; + } + /* create dma_tag for buffers */ #define MAX_REQCOUNT 0xffff if (bus_dma_tag_create(/*parent*/ sc->fc.dmat, @@ -1484,6 +1489,12 @@ fwohci_itxbuf_enable(struct firewire_comm *fc, int dmach) if ((dbch->flags & FWOHCI_DBCH_INIT) == 0) { dbch->ndb = it->bnpacket * it->bnchunk; dbch->ndesc = 3; + if (dbch->ndb == 0) { + kprintf("fwohci: invalid iso tx buffer spec " + "(bnpacket=%u bnchunk=%u)\n", + it->bnpacket, it->bnchunk); + return (EINVAL); + } fwohci_db_init(sc, dbch); if ((dbch->flags & FWOHCI_DBCH_INIT) == 0) return ENOMEM; @@ -1605,6 +1616,12 @@ fwohci_irx_enable(struct firewire_comm *fc, int dmach) ir->queued = 0; dbch->ndb = ir->bnpacket * ir->bnchunk; dbch->ndesc = 2; + if (dbch->ndb == 0) { + kprintf("fwohci: invalid iso rx buffer spec " + "(bnpacket=%u bnchunk=%u)\n", + ir->bnpacket, ir->bnchunk); + return (EINVAL); + } fwohci_db_init(sc, dbch); if ((dbch->flags & FWOHCI_DBCH_INIT) == 0) return ENOMEM; |