Mike,

but it does check in vscsiopen(). Hence no userland program should be
able to call vscsiioctl() for a non-existant device because the open()
already failed. At least that's true as long as vscsi devices can't
disappear during run-time.

Gerhard


On Fri, 10 May 2013 14:44:39 +0200 Mike Belopuhov <m...@belopuhov.com> wrote:
> On Fri, May 03, 2013 at 16:19 +0200, Mike Belopuhov wrote:
> > hi,
> > 
> > while looking for the device_unref bugs, i found that
> > vscsi doesn't check if device_lookup has returned a
> > valid return value.
> > 
> > ok?
> > 
> 
> anyone?
> 
> > diff --git sys/dev/vscsi.c sys/dev/vscsi.c
> > index 3da371c..db65642 100644
> > --- sys/dev/vscsi.c
> > +++ sys/dev/vscsi.c
> > @@ -296,6 +296,9 @@ vscsiioctl(dev_t dev, u_long cmd, caddr_t addr, int 
> > flags, struct proc *p)
> >     int                             read = 0;
> >     int                             err = 0;
> >  
> > +   if (sc == NULL)
> > +           return (ENXIO);
> > +
> >     rw_enter_write(&sc->sc_ioc_lock);
> >  
> >     switch (cmd) {
> > @@ -476,6 +479,9 @@ vscsipoll(dev_t dev, int events, struct proc *p)
> >     struct vscsi_softc              *sc = DEV2SC(dev);
> >     int                             revents = 0;
> >  
> > +   if (sc == NULL)
> > +           return (ENXIO);
> > +
> >     if (events & (POLLIN | POLLRDNORM)) {
> >             mtx_enter(&sc->sc_state_mtx);
> >             if (!TAILQ_EMPTY(&sc->sc_ccb_i2t))
> > @@ -494,9 +500,14 @@ vscsipoll(dev_t dev, int events, struct proc *p)
> >  
> >  int
> >  vscsikqfilter(dev_t dev, struct knote *kn)
> > -{ 
> > +{
> >     struct vscsi_softc *sc = DEV2SC(dev);
> > -   struct klist *klist = &sc->sc_sel.si_note;
> > +   struct klist *klist;
> > +
> > +   if (sc == NULL)
> > +           return (ENXIO);
> > +
> > +   klist = &sc->sc_sel.si_note;
> >  
> >     switch (kn->kn_filter) {
> >     case EVFILT_READ:
> 


Reply via email to