tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: RFC: vioif(4) multiqueue support



On Wed, Dec 26, 2018 at 02:37:02AM +0000, Taylor R Campbell wrote:
> > +static int
> > +vioif_alloc_queues(struct vioif_softc *sc)
> > +{
> > +	int nvq_pairs = sc->sc_max_nvq_pairs;
> > +	int nvqs = nvq_pairs * 2;
> > +	int i;
> > +
> > +	sc->sc_rxq = kmem_zalloc(sizeof(sc->sc_rxq[0]) * nvq_pairs,
> > +	    KM_NOSLEEP);
> > +	if (sc->sc_rxq == NULL)
> > +		return -1;
> > +
> > +	sc->sc_txq = kmem_zalloc(sizeof(sc->sc_txq[0]) * nvq_pairs,
> > +	    KM_NOSLEEP);
> > +	if (sc->sc_txq == NULL)
> > +		return -1;
> 
> Check to avoid arithmetic overflow here:
> 
> 	if (nvq_pairs > INT_MAX/2 - 1 ||
> 	    nvq_pairs > SIZE_MAX/sizeof(sc->sc_rxq[0]))
> 		return -1;
> 	nvqs = nvq_pairs * 2;
> 	if (...) nvqs++;
> 	sc->sc_rxq = kmem_zalloc(sizeof(sc->sc_rxq[0]) * nvq_pairs, ...);
> 
> Same in all the other allocations like this.  (We should have a
> kmem_allocarray -- I have a draft somewhere.)

The limit should just be sanely enforced much, much earlier. The code
in ioif_attach already does that, so why bother.

> > diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c
> > index 65c5222b774..bb972997be2 100644
> > --- a/sys/dev/pci/virtio_pci.c
> > +++ b/sys/dev/pci/virtio_pci.c
> > @@ -604,8 +677,14 @@ virtio_pci_setup_interrupts(struct virtio_softc *sc)
> > [...]
> >  	if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_MSIX) {
> > -		psc->sc_ihs = kmem_alloc(sizeof(*psc->sc_ihs) * 2,
> > +		psc->sc_ihs = kmem_alloc(sizeof(*psc->sc_ihs) * nmsix,
> >  		    KM_SLEEP);
> 
> Check for arithmetic overflow here.

No point here either.

Joerg


Home | Main Index | Thread Index | Old Index