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);