diff options
author | Matthew Dempsky <matthew@cvs.openbsd.org> | 2011-07-08 05:11:22 +0000 |
---|---|---|
committer | Matthew Dempsky <matthew@cvs.openbsd.org> | 2011-07-08 05:11:22 +0000 |
commit | 4480b1440c64cffabc37b459a9dedcbf5580d764 (patch) | |
tree | c2effe868059be9e4e8c53bb60d61b16426e9f30 /sys/dev/vnd.c | |
parent | e4ef3fc4b02860386190cd9a2d101e3f1b580cce (diff) |
Validate DISKUNIT(dev) in vndstrategy() like we do in other
xxstrategy() methods, and punt in validating it in vndread() and
vndwrite() (also like we do in other xx{read,write}() methods...).
Diffstat (limited to 'sys/dev/vnd.c')
-rw-r--r-- | sys/dev/vnd.c | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/sys/dev/vnd.c b/sys/dev/vnd.c index 46ab85b692c..60222a8cdd8 100644 --- a/sys/dev/vnd.c +++ b/sys/dev/vnd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vnd.c,v 1.143 2011/07/08 05:07:05 matthew Exp $ */ +/* $OpenBSD: vnd.c,v 1.144 2011/07/08 05:11:21 matthew Exp $ */ /* $NetBSD: vnd.c,v 1.26 1996/03/30 23:06:11 christos Exp $ */ /* @@ -266,7 +266,7 @@ void vndstrategy(struct buf *bp) { int unit = DISKUNIT(bp->b_dev); - struct vnd_softc *sc = &vnd_softc[unit]; + struct vnd_softc *sc; int s, part; struct iovec aiov; struct uio auio; @@ -275,11 +275,15 @@ vndstrategy(struct buf *bp) DNPRINTF(VDB_FOLLOW, "vndstrategy(%p): unit %d\n", bp, unit); + if (unit >= numvnd) { + bp->b_error = ENXIO; + goto bad; + } + sc = &vnd_softc[unit]; + if ((sc->sc_flags & VNF_HAVELABEL) == 0) { bp->b_error = ENXIO; - bp->b_flags |= B_ERROR; - bp->b_resid = bp->b_bcount; - goto done; + goto bad; } if (bounds_check_with_label(bp, sc->sc_dk.dk_label) == -1) @@ -321,29 +325,21 @@ vndstrategy(struct buf *bp) if (bp->b_error) bp->b_flags |= B_ERROR; bp->b_resid = auio.uio_resid; -done: + goto done; + + bad: + bp->b_flags |= B_ERROR; + bp->b_resid = bp->b_bcount; + done: s = splbio(); biodone(bp); splx(s); } - /* ARGSUSED */ int vndread(dev_t dev, struct uio *uio, int flags) { - int unit = DISKUNIT(dev); - struct vnd_softc *sc; - - DNPRINTF(VDB_FOLLOW, "vndread(%x, %p)\n", dev, uio); - - if (unit >= numvnd) - return (ENXIO); - sc = &vnd_softc[unit]; - - if ((sc->sc_flags & VNF_INITED) == 0) - return (ENXIO); - return (physio(vndstrategy, dev, B_READ, minphys, uio)); } @@ -351,18 +347,6 @@ vndread(dev_t dev, struct uio *uio, int flags) int vndwrite(dev_t dev, struct uio *uio, int flags) { - int unit = DISKUNIT(dev); - struct vnd_softc *sc; - - DNPRINTF(VDB_FOLLOW, "vndwrite(%x, %p)\n", dev, uio); - - if (unit >= numvnd) - return (ENXIO); - sc = &vnd_softc[unit]; - - if ((sc->sc_flags & VNF_INITED) == 0) - return (ENXIO); - return (physio(vndstrategy, dev, B_WRITE, minphys, uio)); } |