Index: sys/dev/dksubr.c
===================================================================
RCS file: /cvsroot/src/sys/dev/dksubr.c,v
retrieving revision 1.101
diff -u -r1.101 dksubr.c
--- sys/dev/dksubr.c	4 Dec 2017 22:15:52 -0000	1.101
+++ sys/dev/dksubr.c	28 Apr 2018 14:55:39 -0000
@@ -762,10 +762,11 @@
     daddr_t blkno, void *vav, size_t size)
 {
 	const struct dkdriver *dkd = dksc->sc_dkdev.dk_driver;
+	struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
 	char *va = vav;
 	struct disklabel *lp;
 	struct partition *p;
-	int part, towrt, nsects, sectoff, maxblkcnt, nblk;
+	int part, towrt, maxblkcnt, nblk;
 	int maxxfer, rv = 0;
 
 	/*
@@ -804,23 +805,44 @@
 	blkno = dbtob(blkno) / lp->d_secsize;   /* blkno in secsize units */
 
 	p = &lp->d_partitions[part];
-	if (p->p_fstype != FS_SWAP) {
-		DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
-		    p->p_fstype));
-		return ENXIO;
-	}
-	nsects = p->p_size;
-	sectoff = p->p_offset;
+	if (part == RAW_PART) {
+		if (p->p_fstype != FS_UNUSED) {
+			DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
+			    p->p_fstype));
+			return ENXIO;
+		}
+		/* Check wether dump goes to a wedge */
+		if (dksc->sc_dkdev.dk_nwedges == 0) {
+			DPRINTF(DKDB_DUMP, ("%s: dump to raw\n", __func__));
+			return ENXIO;
+		}
+		/* Check transfer bounds against media size */
+		if (blkno < 0 || (blkno + towrt) > dg->dg_secperunit) {
+			DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
+			    "nsects=%jd\n", __func__, (intmax_t)blkno, towrt, dg->dg_secperunit));
+			return EINVAL;
+		}
+	} else {
+		int nsects, sectoff;
 
-	/* Check transfer bounds against partition size. */
-	if ((blkno < 0) || ((blkno + towrt) > nsects)) {
-		DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
-		    "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects));
-		return EINVAL;
-	}
+		if (p->p_fstype != FS_SWAP) {
+			DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
+			    p->p_fstype));
+			return ENXIO;
+		}
+		nsects = p->p_size;
+		sectoff = p->p_offset;
 
-	/* Offset block number to start of partition. */
-	blkno += sectoff;
+		/* Check transfer bounds against partition size. */
+		if ((blkno < 0) || ((blkno + towrt) > nsects)) {
+			DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
+			    "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects));
+			return EINVAL;
+		}
+
+		/* Offset block number to start of partition. */
+		blkno += sectoff;
+	}
 
 	/* Start dumping and return when done. */
 	maxblkcnt = howmany(maxxfer, lp->d_secsize);
Index: sys/dev/dkwedge/dk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/dkwedge/dk.c,v
retrieving revision 1.96
diff -u -r1.96 dk.c
--- sys/dev/dkwedge/dk.c	5 Mar 2017 23:07:12 -0000	1.96
+++ sys/dev/dkwedge/dk.c	28 Apr 2018 14:55:39 -0000
@@ -1613,7 +1613,7 @@
 		rv = EINVAL;
 		goto out;
 	}
-	if (blkno + size / DEV_BSIZE > sc->sc_size) {
+	if (blkno < 0 || blkno + size / DEV_BSIZE > sc->sc_size) {
 		printf("%s: blkno (%" PRIu64 ") + size / DEV_BSIZE (%zu) > "
 		    "sc->sc_size (%" PRIu64 ")\n", __func__, blkno,
 		    size / DEV_BSIZE, sc->sc_size);
