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?

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