summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <matthew@cvs.openbsd.org>2011-07-08 05:11:22 +0000
committerMatthew Dempsky <matthew@cvs.openbsd.org>2011-07-08 05:11:22 +0000
commit4480b1440c64cffabc37b459a9dedcbf5580d764 (patch)
treec2effe868059be9e4e8c53bb60d61b16426e9f30
parente4ef3fc4b02860386190cd9a2d101e3f1b580cce (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...).
-rw-r--r--sys/dev/vnd.c46
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));
}